Bobot_fieldops.c

/******************************************************************
fichier créer par 3emeType le 22/04/04
Rassemble toutes les fonctions spécifiques au fieldops
*******************************************************************/
#include "../game/g_local.h"
#include "bobot.h"
/*******************************************************************
Joc : le field ops donne des munitions
*******************************************************************/
qboolean BOBOT_heavy_weapon(int weapon)
{   
    switch(weapon)
    {    case WP_PANZERFAUST:        return qtrue;
        case WP_BAZOOKA:            return qtrue;
        case WP_FLAMETHROWER:        return qtrue;
        case WP_MOBILE_MG42:        return qtrue;
        case WP_MOBILE_MG42_SET:    return qtrue;
        case WP_MORTAR:                return qtrue;
        case WP_MORTAR_SET:            return qtrue;
        case WP_BROWNING:            return qtrue;
        case WP_BROWNING_SET:        return qtrue;
    }
    return qfalse;
}

extern int BOBOT_ammoPercentage(gentity_t *bobot);

//teammate peut être lui même ou un équipier.
void BOBOT_FIELDOPS_GiveAmmo(gentity_t *bobot, usercmd_t *ucmd)
{     Sbobot        *bobotAI = &bobots[bobot->s.clientNum];
    vec3_t        dir,angles;
    vec_t        dist;
    gentity_t    *teammate = bobotAI->currentAction.ent;
    qboolean    actionAuthorizedByArms;

    if((teammate == NULL) || (teammate->client->ps.pm_type == PM_DEAD) ||
       (teammate->client == NULL) || (!teammate->inuse) || (teammate->client->ps.pm_flags & PMF_LIMBO))
    {    BOBOT_AI_endOfCurrentAction(bobotAI);
        BOBOT_COMMON_TakeBestWeapon(bobot,bobotAI->myteam,ucmd);
        return;
    }
    /* Pas s'il est dans l'eau */
    if(teammate->waterlevel>1)
    {    BOBOT_AI_endOfCurrentAction(bobotAI);                        // 3emeType : on stoppe l'action
        BOBOT_COMMON_TakeBestWeapon(bobot,bobotAI->myteam,ucmd);
        return;
    }
    /*    on ne donne plus de munipack s'il est à fond */
    if(BOBOT_ammoPercentage(teammate) >= 100)
    {    BOBOT_AI_endOfCurrentAction(bobotAI);
        BOBOT_COMMON_TakeBestWeapon(bobot,bobotAI->myteam,ucmd);
        return;
    }
    VectorSubtract (teammate->r.currentOrigin, bobot->client->ps.origin, dir);
    /*    le déroulement de l'action dépend de la présence ou non d'un ennemi.
        s'il y en a un, les bras du bot donneront priorité au tir.*/
    actionAuthorizedByArms = BOBOT_AI_proposeActionToArms(bobotAI,BOBOT_OBEY_TO_ACTION,NULL);
    /*    on vise le gars, il est 1 peu + haut */
    dir[2] -= bobot->client->ps.viewheight;
    if(actionAuthorizedByArms)
    {    vectoangles (dir, angles);
        AnglesSubtract (angles , bobot->s.angles , angles);
        BOBOT_MOVEMENT_ChangeBotAngle(angles,bobot);
    }
    dist = VectorLengthSquared(dir);
    if (dist < BOBOT_DIST_CARRY_PACK)
    {    if(actionAuthorizedByArms)            // si ses bras acceptent
        { ucmd->weapon = WP_AMMO; }            // le bot prend le pack juste avant de le donner
    }
    else                                    // si on s'éloigne
    { BOBOT_COMMON_TakeBestWeapon(bobot,bobotAI->myteam,ucmd); }
    if (dist < BOBOT_DIST_GIVE_PACK && bobot->client->ps.weapon == WP_AMMO)
    {    if(actionAuthorizedByArms)            // si ses bras acceptent
        { ucmd->buttons = BUTTON_ATTACK; }    // donne le pack
    }
    else if(teammate != bobot)                // si ce n'est pas lui-même qu'il ravitaille
    {    /* Ne pas donner de munitions à un autre fieldops, qui peut s'en donner lui même, il n'a qu'à le faire lui même */
        if(teammate->client->sess.playerType == PC_FIELDOPS)
        {    BOBOT_AI_endOfCurrentAction(bobotAI);
            BOBOT_COMMON_TakeBestWeapon(bobot,bobotAI->myteam,ucmd);
            return;
        }
        BOBOT_Move(bobot,ucmd);    // il va vers son équipier
    }
}

Créer un site gratuit avec e-monsite - Signaler un contenu illicite sur ce site