void Person::doAI()
{
- if (!isPlayerControlled() && !isPlayerFriend() && !Dialog::inDialog()) {
+ if (!isPlayerControlled() && !Dialog::inDialog()) {
jumpclimb = 0;
//disable movement in editor
if (Game::editorenabled) {
if ((!Tutorial::active || cananger) &&
hostile &&
+ !isPlayerFriend() &&
!Person::players[0]->dead &&
distsq(&coords, &Person::players[0]->coords) < 400 &&
occluded < 25) {
//hearing sounds
if (!Game::editorenabled) {
if (howactive <= typesleeping) {
- if (numenvsounds > 0 && (!Tutorial::active || cananger) && hostile) {
+ if (numenvsounds > 0 && (!Tutorial::active || cananger) && !isPlayerFriend() && hostile) {
for (int j = 0; j < numenvsounds; j++) {
float vol = howactive == typesleeping ? envsoundvol[j] - 14 : envsoundvol[j];
if (vol > 0 && distsq(&coords, &envsound[j]) < 2 * (vol + vol * (creature == rabbittype) * 3)) {
if (howactive < typesleeping &&
((!Tutorial::active || cananger) && hostile) &&
+ !isPlayerFriend() &&
!Person::players[0]->dead &&
distsq(&coords, &Person::players[0]->coords) < 400 &&
occluded < 25) {
jumpkeydown = 1;
}
- if (numenvsounds > 0 && ((!Tutorial::active || cananger) && hostile)) {
+ if (numenvsounds > 0 && ((!Tutorial::active || cananger) && !isPlayerFriend() && hostile)) {
for (int k = 0; k < numenvsounds; k++) {
if (distsq(&coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (creature == rabbittype) * 3)) {
aitype = attacktypecutoff;
}
if (!Person::players[0]->dead &&
+ !isPlayerFriend() &&
losupdatedelay < 0 &&
!Game::editorenabled &&
occluded < 2 &&
lastseentime = 12;
- if (!Person::players[0]->dead && ((!Tutorial::active || cananger) && hostile)) {
+ if (!Person::players[0]->dead && !isPlayerFriend() && ((!Tutorial::active || cananger) && hostile)) {
if (ally < 0 || hasWeapon() || lastchecktime <= 0) {
aitype = attacktypecutoff;
lastseentime = 1;
}
}
}
+
//stunned
if (aitype == passivetype && !(numwaypoints > 1) ||
stunned > 0 ||
throwkeydown = 0;
}
+ // friends follow player
+ if (stunned < 1 &&
+ isPlayerFriend() &&
+ !Person::players[0]->dead &&
+ distsq(&coords, &Person::players[0]->coords) > 5) {
+ XYZ rotatetarget = Person::players[0]->coords + Person::players[0]->velocity;
+ XYZ targetpoint = Person::players[0]->coords;
+ velocity = (targetpoint - coords);
+ velocity.y += 2;
+ float vellength = findLength(&velocity);
+ if (vellength != 0 &&
+ distsq(&Person::players[0]->coords, &coords) < distsq(&rotatetarget, &coords)) {
+ targetpoint += Person::players[0]->velocity *
+ findDistance(&Person::players[0]->coords, &coords) / vellength;
+ }
+ targetyaw = roughDirectionTo(coords, targetpoint);
+ lookyaw = targetyaw;
+ forwardkeydown = 1;
+ aitype = searchtype;
+ }
+
XYZ facing;
facing = 0;
facing.z = -1;
} else if (howactive >= typesleeping) {
targetheadyaw = targetyaw;
targetheadpitch = 0;
+ } else if (isPlayerFriend()) {
+ targetheadyaw = 180 - roughDirectionTo(coords, Person::players[0]->coords);
+ targetheadpitch = pitchTo(coords, Person::players[0]->coords);
} else {
if (interestdelay <= 0) {
interestdelay = .7 + (float)(abs(Random() % 100)) / 100;