DEFINE_ACTION_FUNCTION(AActor, A_SnoutAttack) { angle_t angle; int damage; int slope; player_t *player; AActor *puff; AActor *linetarget; if (NULL == (player = self->player)) { return; } damage = 3+(pr_snoutattack()&3); angle = player->mo->angle; slope = P_AimLineAttack(player->mo, angle, MELEERANGE, &linetarget); puff = P_LineAttack(player->mo, angle, MELEERANGE, slope, damage, NAME_Melee, "SnoutPuff", true); S_Sound(player->mo, CHAN_VOICE, "PigActive", 1, ATTN_NORM); // [Dusk] clients aren't properly aware of linetarget, thus they stop here. if (NETWORK_InClientMode()) return; if(linetarget) { AdjustPlayerAngle(player->mo, linetarget); // [Dusk] update angle if (NETWORK_GetState() == NETSTATE_SERVER) SERVERCOMMANDS_MoveThing(player->mo, CM_ANGLE); if(puff != NULL) { // Bit something S_Sound(player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); // [Dusk] tell clients of the attack sound if (NETWORK_GetState() == NETSTATE_SERVER) SERVERCOMMANDS_SoundActor (player->mo, CHAN_VOICE, "PigAttack", 1, ATTN_NORM); } } }
DEFINE_ACTION_FUNCTION(AActor, A_FiredChase) { int weaveindex = self->special1; AActor *target = self->target; angle_t ang; fixed_t dist; // [BC] Let the server do this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { // make active sound if (pr_firedemonchase() < 3) { self->PlayActiveSound (); } // Normal movement if ( self->special2 == 0 ) P_Move( self ); return; } if (self->reactiontime) self->reactiontime--; if (self->threshold) self->threshold--; // Float up and down self->z += FloatBobOffsets[weaveindex]; self->special1 = (weaveindex+2)&63; // Ensure it stays above certain height if (self->z < self->floorz + (64*FRACUNIT)) { self->z += 2*FRACUNIT; } // [BC] If we're the server, update the thing's z position. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_MoveThing( self, CM_Z ); if(!self->target || !(self->target->flags&MF_SHOOTABLE)) { // Invalid target P_LookForPlayers (self,true, NULL); return; } // Strafe if (self->special2 > 0) { self->special2--; } else { self->special2 = 0; self->velx = self->vely = 0; dist = P_AproxDistance (self->x - target->x, self->y - target->y); if (dist < FIREDEMON_ATTACK_RANGE) { if (pr_firedemonchase() < 30) { ang = R_PointToAngle2 (self->x, self->y, target->x, target->y); if (pr_firedemonchase() < 128) ang += ANGLE_90; else ang -= ANGLE_90; ang >>= ANGLETOFINESHIFT; self->velx = finecosine[ang] << 3; //FixedMul (8*FRACUNIT, finecosine[ang]); self->vely = finesine[ang] << 3; //FixedMul (8*FRACUNIT, finesine[ang]); self->special2 = 3; // strafe time } } // [BC] If we're the server, update the thing's z position. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) { SERVERCOMMANDS_MoveThingExact( self, CM_MOMX|CM_MOMY ); SERVERCOMMANDS_SetThingSpecial2( self ); } }