1 #using scripts\codescripts\struct;
3 #using scripts\shared\math_shared;
4 #using scripts\shared\sound_shared;
6 #insert scripts\shared\shared.gsh;
9 #using scripts\shared\ai\zombie_utility;
24 function LookAtEntity(lookTargetEntity, lookDuration, lookSpeed, eyesOnly, interruptOthers)
29 function LookAtPosition(lookTargetPos, lookDuration, lookSpeed, eyesOnly, interruptOthers)
31 assert(isAI(
self),
"Can only call this function on an AI character");
32 assert(
self.
a.targetLookInitilized ==
true,
"LookAtPosition called on AI that lookThread was not called on");
33 assert( (lookSpeed ==
"casual") || (lookSpeed ==
"alert"),
"lookSpeed must be casual or alert");
36 if ( !isdefined(interruptOthers) || (interruptOthers==
"interrupt others") || (GetTime() >
self.
a.lookEndTime) )
38 self.a.lookTargetPos = lookTargetPos;
39 self.a.lookEndTime = GetTime() + (lookDuration*1000);
41 if(lookSpeed ==
"casual")
43 self.a.lookTargetSpeed = 800;
47 self.a.lookTargetSpeed = 1600;
50 if ( isdefined(eyesOnly) && (eyesOnly==
"eyes only") )
52 self notify(
"eyes look now");
56 self notify(
"look now");
63 self.a.LookAnimationLeft = leftanim;
64 self.a.LookAnimationRight = rightanim;
69 if ( note ==
"sound_dogstep_run_default" || note ==
"dogstep_rf" || note ==
"dogstep_lf" )
71 self PlaySound(
"fly_dog_step_run_default" );
75 prefix = getsubstr( note, 0, 5 );
77 if ( prefix !=
"sound" )
82 alias =
"aml" + getsubstr( note, 5 );
84 if ( IsAlive(
self ) )
98 return isdefined(
self.script_growl );
138 if( isdefined(
self.noragdoll ) )
149 if( IsSentient(
self ) )
151 self.a.movement =
"stop";
157 if( IsSentient(
self ) )
159 self.a.movement =
"walk";
165 if( IsSentient(
self ) )
167 self.a.movement =
"run";
173 if( IsSentient(
self ) )
175 self.a.alertness =
"casual";
181 if( IsSentient(
self ) )
183 self.a.alertness =
"alert";
190 self.a.pose =
"stand";
191 self notify (
"entered_pose" +
"stand");
196 self.a.pose =
"crouch";
197 self notify (
"entered_pose" +
"crouch");
199 if (
self.
a.crouchPain)
202 self.a.crouchPain =
false;
209 if ( isSubStr( note,
"on" ) )
211 self AnimMode(
"gravity" );
213 else if ( isSubStr( note,
"off" ) )
215 self AnimMode(
"nogravity" );
216 self.nogravity =
true;
218 else if ( isSubStr( note,
"code" ) )
220 self AnimMode(
"none" );
221 self.nogravity = undefined;
227 if ( isdefined(
self.groundType ) )
229 groundType =
self.groundType;
236 if ( isSubStr( note,
"large" ) )
238 self PlaySound (
"fly_bodyfall_large_" + groundType);
240 else if ( isSubStr( note,
"small" ) )
242 self PlaySound (
"fly_bodyfall_small_" + groundType);
248 if ( isSubStr( note,
"left" ) )
261 if(!level.clientScripts)
263 self PlaySound(
"fly_gear_run" );
270 if ( isdefined(
self.groundType ) )
272 groundType =
self.groundType;
279 self PlaySound (
"fly_step_scrape_" + groundType );
285 if ( isdefined(
self.groundType ) )
287 groundType =
self.groundType;
294 self PlaySound (
"fly_land_npc_" + groundType );
299 if ( isAI(
self ) && isdefined(anim.notetracks) )
301 notetrackFunc = anim.notetracks[note];
302 if ( isdefined( notetrackFunc ) )
304 return [[notetrackFunc]]( note, flagName );
313 if ( isAI(
self) &&
self.a.pose==
"back" )
329 self.a.nodeath =
true;
332 self.allowpain =
false;
335 self.allowpain =
true;
337 case "anim_melee = right":
338 case "anim_melee = \"right\"":
339 self.a.meleeState =
"right";
341 case "anim_melee = left":
342 case "anim_melee = \"left\"":
343 self.a.meleeState =
"left";
345 case "swap taghelmet to tagleft":
346 if ( isdefined (
self.hatModel ) )
348 if (isdefined(
self.helmetSideModel))
350 self detach(
self.helmetSideModel,
"TAG_HELMETSIDE");
351 self.helmetSideModel = undefined;
353 self detach (
self.hatModel,
"");
354 self attach (
self.hatModel,
"TAG_WEAPON_LEFT");
355 self.hatModel = undefined;
359 if (isdefined(customFunction))
361 if (!isdefined(var1))
363 return [[customFunction]] (note);
367 return [[customFunction]] (note, var1);
383 self waittill (flagName, note);
385 if ( !isdefined( note ) )
390 if ( isdefined( val ) )
397 if (isdefined (killString))
398 self endon (killString);
399 self endon (
"killanimscript");
404 returnedNote = [[notetracksFunc]](flagName, customFunction, var1);
405 timetaken = GetTime() - time;
406 if ( timetaken < 0.05)
409 returnedNote = [[notetracksFunc]](flagName, customFunction, var1);
410 timetaken = GetTime() - time;
411 if ( timetaken < 0.05)
413 wait ( 0.05 - timetaken );
427 ent endon (
"stop_notetracks");
428 [[doNoteTracksForeverFunc]](flagName, undefined, customFunction, var1);
442 self notify (
"stop_notetracks");
447 if(!level.clientScripts)
451 self PlaySound (
"fly_step_run_dirt");
456 groundType = undefined;
458 if (!isdefined(
self.groundtype))
460 if (!isdefined(
self.lastGroundtype))
462 if(!level.clientScripts)
464 self PlaySound (
"fly_step_run_dirt");
469 groundtype =
self.lastGroundtype;
473 groundtype =
self.groundtype;
474 self.lastGroundtype =
self.groundType;
477 if(!level.clientScripts)
479 self PlaySound (
"fly_step_run_" + groundType);
481 [[anim.optionalStepEffectFunction]](foot, groundType);
490 if(level.clientScripts)
495 for (i=0;i<anim.optionalStepEffects.size;i++)
499 if( isdefined(
self.fire_footsteps ) &&
self.fire_footsteps )
504 if (groundType != anim.optionalStepEffects[i])
509 org =
self gettagorigin(foot);
510 playfx(level._effect[
"step_" + anim.optionalStepEffects[i]], org, org + (0,0,100));
517 self endon(
"killanimscript");
519 if ( DistanceSquared(
self.origin, origin ) > 16*16 && !
self mayMoveToPoint( origin ) )
524 self.keepClaimedNodeInGoal =
true;
526 offset =
self.origin - origin;
528 frames = int(time * 20);
529 offsetreduction = VectorScale( offset, 1.0 / frames );
531 for ( i = 0; i < frames; i++ )
533 offset -= offsetreduction;
534 self Teleport( origin + offset );
538 self.keepClaimedNodeInGoal =
false;
548 players = GetPlayers();
549 deltaChangePerFrame = 5;
555 maxYawDeltaChange = 5;
556 maxPitchDeltaChange = 5;
561 if ( (
self.type ==
"dog") || (
self.type ==
"zombie") || (
self.type ==
"zombie_dog") )
563 doMaxAngleCheck =
false;
564 self.shootEnt =
self.enemy;
568 doMaxAngleCheck =
true;
569 if (
self.
a.script ==
"cover_crouch" && isdefined(
self.
a.coverMode ) &&
self.a.coverMode ==
"lean" )
570 pitchAdd = -1 * anim.coverCrouchLeanPitch;
571 if ( (
self.
a.script ==
"cover_left" ||
self.a.script ==
"cover_right") && isdefined(
self.
a.cornerMode ) &&
self.a.cornerMode ==
"lean" )
572 yawAdd =
self.coverNode.angles[1] -
self.angles[1];
584 selfShootAtPos = (
self.origin[0],
self.origin[1],
self getEye()[2]);
586 shootPos = undefined;
587 if ( isdefined(
self.enemy ) )
588 shootPos =
self.enemy getShootAtPos();
590 if ( !isdefined( shootPos ) )
597 vectorToShootPos = shootPos - selfShootAtPos;
598 anglesToShootPos = vectorToAngles( vectorToShootPos );
600 pitchDelta = 360 - anglesToShootPos[0];
601 pitchDelta = AngleClamp180( pitchDelta + pitchAdd );
603 yawDelta =
self.angles[1] - anglesToShootPos[1];
605 yawDelta = AngleClamp180( yawDelta + yawAdd );
608 if ( doMaxAngleCheck && ( abs( yawDelta ) > 60 || abs( pitchDelta ) > 60 ) )
615 if ( yawDelta >
self.rightAimLimit )
616 yawDelta =
self.rightAimLimit;
617 else if ( yawDelta <
self.leftAimLimit )
618 yawDelta =
self.leftAimLimit;
619 if ( pitchDelta >
self.upAimLimit )
620 pitchDelta =
self.upAimLimit;
621 else if ( pitchDelta <
self.downAimLimit )
622 pitchDelta =
self.downAimLimit;
631 yawDeltaChange = yawDelta - prevYawDelta;
632 if ( abs( yawDeltaChange ) > maxYawDeltaChange )
633 yawDelta = prevYawDelta + maxYawDeltaChange *
math::sign( yawDeltaChange );
635 pitchDeltaChange = pitchDelta - prevPitchDelta;
636 if ( abs( pitchDeltaChange ) > maxPitchDeltaChange )
637 pitchDelta = prevPitchDelta + maxPitchDeltaChange *
math::sign( pitchDeltaChange );
640 prevYawDelta = yawDelta;
641 prevPitchDelta = pitchDelta;
648 assert( yawDelta <=
self.rightAimLimit );
649 weight = yawDelta /
self.rightAimLimit *
self.a.aimweight;
652 else if ( yawDelta < 0 )
654 assert( yawDelta >=
self.leftAimLimit );
655 weight = yawDelta /
self.leftAimLimit *
self.a.aimweight;
656 leftright = -1 * weight;
659 if ( pitchDelta > 0 )
661 assert( pitchDelta <=
self.upAimLimit );
662 weight = pitchDelta /
self.upAimLimit *
self.a.aimweight;
665 else if ( pitchDelta < 0 )
667 assert( pitchDelta >=
self.downAimLimit );
668 weight = pitchDelta /
self.downAimLimit *
self.a.aimweight;
669 updown = -1 * weight;
680 if ( !isdefined( goaltime ) || goaltime <= 0 )
682 self.a.aimweight = goalweight;
683 self.a.aimweight_start = goalweight;
684 self.a.aimweight_end = goalweight;
685 self.a.aimweight_transframes = 0;
689 self.a.aimweight = goalweight;
690 self.a.aimweight_start =
self.a.aimweight;
691 self.a.aimweight_end = goalweight;
692 self.a.aimweight_transframes = int(goaltime * 20);
694 self.a.aimweight_t = 0;
699 if (
self.
a.aimweight_t <
self.a.aimweight_transframes )
701 self.a.aimweight_t++;
702 t = 1.0 *
self.a.aimweight_t /
self.a.aimweight_transframes;
703 self.a.aimweight =
self.a.aimweight_start * (1 - t) +
self.
a.aimweight_end * t;