void CL_ActorStateChange (const eventRegister_t *self, struct dbuffer *msg) { le_t *le; int entnum, state; character_t *chr; NET_ReadFormat(msg, self->formatString, &entnum, &state); le = LE_Get(entnum); if (!le) LE_NotFoundError(entnum); if (!LE_IsActor(le)) { Com_Printf("StateChange message ignored... LE is no actor (number: %i, state: %i, type: %i)\n", entnum, state, le->type); return; } /* If standing up or crouching down remove the reserved-state for crouching. */ if (((state & STATE_CROUCHED) && !LE_IsCrouched(le)) || (!(state & STATE_CROUCHED) && LE_IsCrouched(le))) { if (CL_ActorUsableTUs(le) < TU_CROUCH && CL_ActorReservedTUs(le, RES_CROUCH) >= TU_CROUCH) { /* We have not enough non-reserved TUs, * but some reserved for crouching/standing up. * i.e. we only reset the reservation for crouching if it's the very last attempt. */ CL_ActorReserveTUs(le, RES_CROUCH, 0); /* Reset reserved TUs (0 TUs) */ } } /* killed by the server: no animation is played, etc. */ if ((state & STATE_DEAD) && LE_IsLivingActor(le)) { le->state = state; FLOOR(le) = NULL; LE_SetThink(le, NULL); VectorCopy(player_dead_maxs, le->maxs); CL_ActorRemoveFromTeamList(le); return; } else { le->state = state; LE_SetThink(le, LET_StartIdle); } /* save those states that the actor should also carry over to other missions */ chr = CL_ActorGetChr(le); if (!chr) return; chr->state = (le->state & STATE_REACTION); /* change reaction button state */ if (!(le->state & STATE_REACTION)) { UI_ExecuteConfunc("disable_reaction"); } else { UI_ExecuteConfunc("startreaction"); } /* state change may have affected move length */ CL_ActorConditionalMoveCalc(le); }
/** * @brief Starts aiming/target mode for selected left/right firemode. * @note Previously know as a combination of CL_FireRightPrimary, CL_FireRightSecondary, * @note CL_FireLeftPrimary and CL_FireLeftSecondary. */ static void HUD_FireWeapon_f (void) { actorHands_t hand; fireDefIndex_t firemode; const objDef_t *ammo; const fireDef_t *fd; if (Cmd_Argc() < 3) { /* no argument given */ Com_Printf("Usage: %s <l|r> <firemode number>\n", Cmd_Argv(0)); return; } if (!selActor) return; hand = ACTOR_GET_HAND_INDEX(Cmd_Argv(1)[0]); firemode = atoi(Cmd_Argv(2)); if (firemode >= MAX_FIREDEFS_PER_WEAPON || firemode < 0) return; fd = HUD_GetFireDefinitionForHand(selActor, hand); if (fd == NULL) return; ammo = fd->obj; /* Let's check if shooting is possible. */ if (!HUD_CheckShooting(selActor, ACTOR_GET_INV(selActor, hand))) return; if (ammo->fd[fd->weapFdsIdx][firemode].time <= CL_ActorUsableTUs(selActor)) { /* Actually start aiming. This is done by changing the current mode of display. */ if (hand == ACTOR_HAND_RIGHT) CL_ActorSetMode(selActor, M_FIRE_R); else CL_ActorSetMode(selActor, M_FIRE_L); /* Store firemode. */ selActor->currentSelectedFiremode = firemode; } else { /* Cannot shoot because of not enough TUs - every other * case should be checked previously in this function. */ HUD_DisplayMessage(_("Can't perform action:\nnot enough TUs.\n")); } }