/* ================ Blocked_Door ================ */ void Blocked_Door( gentity_t *ent, gentity_t *other ) { // remove anything other than a client if ( !other->client ) { // except CTF flags!!!! if( other->s.eType == ET_ITEM && other->item->giType == IT_TEAM ) { Team_DroppedFlagThink( other ); return; } G_TempEntity( other->s.origin, EV_ITEM_POP ); G_FreeEntity( other ); return; } if ( ent->damage ) { if(g_awardpushing.integer) G_Damage( other, ent, ent->activator, NULL, NULL, ent->damage, 0, MOD_CRUSH ); else G_Damage( other, ent, ent, NULL, NULL, ent->damage, 0, MOD_CRUSH ); } if ( ent->spawnflags & 4 ) { return; // crushers don't reverse } // reverse direction Use_BinaryMover( ent, ent, other ); }
/* ============== Touch_Button =============== */ void Touch_Button(gentity_t *ent, gentity_t *other, trace_t *trace ) { if ( !other->client ) { return; } if ( ent->moverState == MOVER_POS1 ) { Use_BinaryMover( ent, other, other ); } }
/* ============== Touch_PlatCenterTrigger If the plat is at the bottom position, start it going up =============== */ void Touch_PlatCenterTrigger(gentity_t *ent, gentity_t *other, trace_t *trace ) { if ( !other->client ) { return; } if ( ent->parent->moverState == MOVER_POS1 ) { Use_BinaryMover( ent->parent, ent, other ); } }
/* ================ Touch_DoorTrigger ================ */ void Touch_DoorTrigger(gentity_t* ent, gentity_t* other, trace_t* trace) { if (other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR) { // if the door is not open and not opening if (ent->parent->moverState != MOVER_1TO2 && ent->parent->moverState != MOVER_POS2) { Touch_DoorTriggerSpectator(ent, other, trace); } } else if (ent->parent->moverState != MOVER_1TO2) { Use_BinaryMover(ent->parent, ent, other); } }
/* ================ Use_BinaryMover ================ */ void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) { int total; int partial; // only the master should be used if ( ent->flags & FL_TEAMSLAVE ) { Use_BinaryMover( ent->teammaster, other, activator ); return; } ent->activator = activator; if ( ent->moverState == MOVER_POS1 ) { // start moving 50 msec later, becase if this was player // triggered, level.time hasn't been advanced yet MatchTeam( ent, MOVER_1TO2, level.time + 50 ); // starting sound if ( ent->sound1to2 ) { G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound1to2 ); } // looping sound ent->s.loopSound = ent->soundLoop; // open areaportal if ( ent->teammaster == ent || !ent->teammaster ) { trap_AdjustAreaPortalState( ent, qtrue ); } return; } // if all the way up, just delay before coming down if ( ent->moverState == MOVER_POS2 ) { ent->nextthink = level.time + ent->wait; return; } // only partway down before reversing if ( ent->moverState == MOVER_2TO1 ) { total = ent->s.pos.trDuration; partial = level.time - ent->s.pos.trTime; if ( partial > total ) { partial = total; } MatchTeam( ent, MOVER_1TO2, level.time - ( total - partial ) ); if ( ent->sound1to2 ) { G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound1to2 ); } return; } // only partway up before reversing if ( ent->moverState == MOVER_1TO2 ) { total = ent->s.pos.trDuration; partial = level.time - ent->s.pos.trTime; if ( partial > total ) { partial = total; } MatchTeam( ent, MOVER_2TO1, level.time - ( total - partial ) ); if ( ent->sound2to1 ) { G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound2to1 ); } return; } }