Added missing settable spawn health for info_player_start

Added support for attenuation = -2 player only for target_speaker
Added header file for Coconut Monkey vulture monster
This commit is contained in:
Knightmare66 2020-02-13 18:49:26 -05:00
parent f1b6052f15
commit 0a88219a83
8 changed files with 286 additions and 57 deletions

View file

@ -60,9 +60,9 @@ void AI_SetSightClient (void)
// Do NOT do this for players using a
// target_monitor, though... in this case
// both player and fake player are ignored.
if(ent->client && ent->client->camplayer)
if (ent->client && ent->client->camplayer)
{
if(ent->client->spycam)
if (ent->client->spycam)
{
level.sight_client = ent->client->camplayer;
return;

View file

@ -100,9 +100,9 @@ void camera_on (edict_t *ent)
// "viewer" can control camera aim (2nd player to come along and use
// camera cannot)
camera = ent->client->spycam;
if(camera->monsterinfo.aiflags & AI_ACTOR)
if (camera->monsterinfo.aiflags & AI_ACTOR)
camera->flags |= FL_ROBOT;
if(!camera->viewer)
if (!camera->viewer)
camera->viewer = ent;
// save current viewangles and restore them with camera_off
@ -162,16 +162,17 @@ void camera_on (edict_t *ent)
// check to see if we're the enemy of any monster. If so, make the
// faker the enemy
for(i=maxclients->value+1, monster=g_edicts+i; i<globals.num_edicts; i++, monster++) {
if(!monster->inuse) continue;
if(!(monster->svflags & SVF_MONSTER)) continue;
if(monster->enemy == ent) {
for (i=maxclients->value+1, monster=g_edicts+i; i<globals.num_edicts; i++, monster++)
{
if (!monster->inuse) continue;
if (!(monster->svflags & SVF_MONSTER)) continue;
if (monster->enemy == ent) {
monster->enemy = faker;
FoundTarget(monster);
}
}
if(ent->client->spycam->viewmessage)
if (ent->client->spycam->viewmessage)
gi.centerprintf(ent,ent->client->spycam->viewmessage);
}

View file

@ -3063,8 +3063,8 @@ void train_move_prox (edict_t *self)
}
}
//Knightmare- this function moves the movewith chilren
//Most of this code is by David Hyde, he got tired of just helping me piecemeal...
// Knightmare- this function moves the movewith children
// Most of this code is by David Hyde, he got tired of just helping me piecemeal...
void turret_stand (edict_t *self);
void train_move_children (edict_t *self)
{
@ -3080,30 +3080,30 @@ void train_move_children (edict_t *self)
if (!self->targetname)
return;
ent = g_edicts+1; // skip the worldspawn
ent = g_edicts+1; // Skip the worldspawn
for (i = 1; i < globals.num_edicts; i++, ent++)
{
if (!ent->classname)
continue;
if (!ent->movewith)
continue;
if(!ent->inuse)
if (!ent->inuse)
return;
if (!strcmp(ent->movewith, self->targetname))
{
ent->movewith_ent = self;
//backup and set movetype to push
if (ent->movetype && (ent->movetype != MOVETYPE_PUSH)) //backup only non-push movetypes
// Backup and set movetype to push
if (ent->movetype && (ent->movetype != MOVETYPE_PUSH)) // backup only non-push movetypes
ent->oldmovetype = ent->movetype;
ent->movetype = MOVETYPE_PUSH;
//set rotational offset
// Set rotational offset
if (!ent->movewith_set)
{
VectorCopy(ent->mins, ent->org_mins);
VectorCopy(ent->maxs, ent->org_maxs);
VectorSubtract (ent->s.origin, self->s.origin, ent->movewith_offset);
//Remeber child's and parent's angles when child was attached
// Remeber child's and parent's angles when child was attached
VectorCopy(self->s.angles, ent->parent_attach_angles);
VectorCopy(ent->s.angles, ent->child_attach_angles);
@ -3113,32 +3113,33 @@ void train_move_children (edict_t *self)
ent->movewith_set = 1;
}
//Get change in parent's angles from when child was attached, this tells us how far we need to rotate
// Get change in parent's angles from when child was attached, this tells us how far we need to rotate
VectorSubtract(self->s.angles, ent->parent_attach_angles, parent_angle_change);
AngleVectors(parent_angle_change, forward, right, up);
VectorNegate(right, right);
//if(!strncmp(ent->classname,"monster_",8))
// if (!strncmp(ent->classname,"monster_",8))
if(ent->svflags & SVF_MONSTER)
is_monster = true;
else
is_monster = false;
/*My old rotational movement code, the children always hanged off a bit...
//get length of offset
/* My old rotational movement code, the children always hanged off a bit...
// Get length of offset
offset_length = VectorLength (ent->movewith_offset);
//get angular vector
// Get angular vector
vectoangles (ent->movewith_offset, dir);
//get rotation for this server frame
// Get rotation for this server frame
VectorScale (self->avelocity, FRAMETIME, amove);
//add rotation
// Add rotation
VectorAdd (dir, amove, dir);
//reduce to angular vector
// Reduce to angular vector
AngleVectors (dir, dir, NULL, NULL);
//restore to original length
// Restore to original length
VectorScale (dir, offset_length, ent->movewith_offset);
//add to origin of parent
VectorAdd (self->s.origin, ent->movewith_offset, ent->s.origin);*/
// Add to origin of parent
VectorAdd (self->s.origin, ent->movewith_offset, ent->s.origin);
*/
// For all but buttons, doors, and plats, move origin and match velocities
if( strcmp(ent->classname,"func_door") && strcmp(ent->classname,"func_button")
@ -3155,23 +3156,23 @@ void train_move_children (edict_t *self)
// If parent is spinning, add appropriate velocities
VectorSubtract(ent->s.origin, self->s.origin, offset);
if(self->avelocity[PITCH] != 0)
if (self->avelocity[PITCH] != 0)
{
ent->velocity[2] -= offset[0] * self->avelocity[PITCH] * M_PI / 180;
ent->velocity[0] += offset[2] * self->avelocity[PITCH] * M_PI / 180;
}
if(self->avelocity[YAW] != 0)
if (self->avelocity[YAW] != 0)
{
ent->velocity[0] -= offset[1] * self->avelocity[YAW] * M_PI / 180.;
ent->velocity[1] += offset[0] * self->avelocity[YAW] * M_PI / 180.;
}
if(self->avelocity[ROLL] != 0)
if (self->avelocity[ROLL] != 0)
{
ent->velocity[1] -= offset[2] * self->avelocity[ROLL] * M_PI / 180;
ent->velocity[2] += offset[1] * self->avelocity[ROLL] * M_PI / 180;
}
VectorScale (self->avelocity, FRAMETIME, amove);
//match angular velocities
// Match angular velocities
if (self->turn_rider)
{
if (!strcmp(ent->classname,"func_rotating"))
@ -3182,7 +3183,8 @@ void train_move_children (edict_t *self)
// ent->s.angles[1] += amove[1];
ent->s.angles[1] += (ent->child_attach_angles[1] + parent_angle_change[1]);
else if(ent->movedir[2] > 0)
ent->s.angles[1] = self->s.angles[1];*/
ent->s.angles[1] = self->s.angles[1];
*/
float cr, sr;
float cy, sy;
@ -3190,17 +3192,17 @@ void train_move_children (edict_t *self)
sy = sin((ent->s.angles[1]-parent_angle_change[1])*M_PI/180);
cr = cos((ent->s.angles[2]-parent_angle_change[2])*M_PI/180);
sr = sin((ent->s.angles[2]-parent_angle_change[2])*M_PI/180);
if(ent->movedir[0] > 0)
if (ent->movedir[0] > 0)
{
ent->s.angles[1] = parent_angle_change[1];
}
else if(ent->movedir[1] > 0)
else if (ent->movedir[1] > 0)
{
ent->s.angles[1] += amove[1];
ent->s.angles[2] = parent_angle_change[2]*cy;
ent->s.angles[0] = -parent_angle_change[2]*sy;
}
else if(ent->movedir[2] > 0)
else if (ent->movedir[2] > 0)
{
ent->s.angles[1] = parent_angle_change[0]*-sy;
}
@ -3209,9 +3211,9 @@ void train_move_children (edict_t *self)
else if (!is_monster)
{ // Not a monster/actor. We want monsters/actors to be able to turn on
// their own.
if(!ent->do_not_rotate)
if (!ent->do_not_rotate)
{
if(!strcmp(ent->classname,"turret_breach") || !strcmp(ent->classname,"turret_base"))
if (!strcmp(ent->classname,"turret_breach") || !strcmp(ent->classname,"turret_base"))
VectorCopy(self->avelocity, ent->avelocity);
else if (!strcmp(ent->classname,"func_door_rotating"))
{
@ -3230,13 +3232,13 @@ void train_move_children (edict_t *self)
}
//don't move child's angles if not moving self
else if (ent->solid == SOLID_BSP) //&& (VectorLength(self->velocity) || VectorLength(self->avelocity)) )
{ // brush models always start out with angles=0,0,0 (after G_SetMoveDir).
{ // Brush models always start out with angles=0,0,0 (after G_SetMoveDir).
// Use more accuracy here.
VectorCopy(self->avelocity, ent->avelocity);
// VectorCopy(self->s.angles, ent->s.angles);
VectorAdd(ent->child_attach_angles, parent_angle_change, ent->s.angles);
}
else if(ent->movetype == MOVETYPE_NONE)
else if (ent->movetype == MOVETYPE_NONE)
{
VectorCopy(self->avelocity, ent->avelocity);
// VectorCopy(self->s.angles, ent->s.angles);
@ -3270,8 +3272,8 @@ void train_move_children (edict_t *self)
if (ent->s.frame < 2)
VectorAdd(ent->child_attach_angles, parent_angle_change, ent->s.angles);
// update aiming
//else if (!strcmp(self->classname, "func_rotating") || !strcmp(self->classname, "func_rotating_dh"))
// TurretAim (ent);
// else if (!strcmp(self->classname, "func_rotating") || !strcmp(self->classname, "func_rotating_dh"))
// TurretAim (ent);
}
// otherwise don't re-angle turrets
//else if (strcmp(ent->classname,"monster_turret"))
@ -3288,7 +3290,7 @@ void train_move_children (edict_t *self)
{
VectorAdd(ent->s.angles, ent->org_angles, angles);
G_SetMovedir (angles, ent->movedir);
//Knightmare- these entities need special calculations
// Knightmare- these entities need special calculations
if (!strcmp(ent->classname,"monster_turret") || !strcmp(ent->classname,"turret_wall"))
{
vec3_t eforward, tangles;
@ -3326,7 +3328,7 @@ void train_move_children (edict_t *self)
VectorScale(eforward, ent->length, eforward);
else
VectorScale(eforward, ent->length * -1 , eforward);
if (ent->spawnflags & 32) //SEC_MOVE_RIGHT
if (ent->spawnflags & 32) // SEC_MOVE_RIGHT
VectorScale(eright, ent->width, eright);
else
VectorScale(eright, ent->width * -1, eright);
@ -3438,7 +3440,7 @@ void train_move_children (edict_t *self)
FMOD_UpdateSpeakerPos(ent);
// Correct func_door_rotating start/end positions
/* if (!strcmp(ent->classname,"func_door_rotating") && (!ent->do_not_rotate))
/* if (!strcmp(ent->classname,"func_door_rotating") && (!ent->do_not_rotate))
{
VectorCopy (ent->s.angles, ent->pos1);
VectorMA (ent->s.angles, ent->moveinfo.distance, ent->movedir, ent->pos2);

View file

@ -225,10 +225,10 @@ movefield:
self->velocity[2] += offset[1] * host->avelocity[ROLL] * M_PI / 180;
}
VectorScale (host->avelocity, FRAMETIME, amove);
VectorAdd(self->child_attach_angles, host_angle_change, self->s.angles); //add rotation to angles
VectorAdd(self->child_attach_angles, host_angle_change, self->s.angles); // add rotation to angles
// VectorAdd(self->s.angles, amove, self->s.angles); //add rotation to angles
if(amove[YAW]) // Cross fingers here... move bounding box
if (amove[YAW]) // Cross fingers here... move bounding box
{
float ca, sa, yaw;
vec3_t p00, p01, p10, p11;

View file

@ -25,6 +25,10 @@ void SP_target_temp_entity (edict_t *ent)
/*QUAKED target_speaker (1 0 0) (-8 -8 -8) (8 8 8) looped-on looped-off reliable
"noise" wav file to play
"attenuation"
DWH
-2 = only played (full volume) for player who triggered the target_speaker
end DWH
-1 = none, send to whole level
1 = normal fighting sounds
2 = idle sound level
@ -43,8 +47,9 @@ void Use_Target_Speaker (edict_t *ent, edict_t *other, edict_t *activator)
if (ent->spawnflags & 3)
{ // looping sound toggles
if (ent->s.sound)
if (ent->s.sound) {
ent->s.sound = 0; // turn it off
}
else {
ent->s.sound = ent->noise_index; // start it
#ifdef LOOP_SOUND_ATTENUATION
@ -53,14 +58,31 @@ void Use_Target_Speaker (edict_t *ent, edict_t *other, edict_t *activator)
}
}
else
{ // normal sound
if (ent->spawnflags & 4)
chan = CHAN_VOICE|CHAN_RELIABLE;
{
if (ent->attenuation == -2)
{
if (ent->spawnflags & 4)
chan = CHAN_VOICE|CHAN_RELIABLE;
else
chan = CHAN_VOICE;
gi.sound (activator, chan, ent->noise_index, 1, ATTN_NORM, 0);
}
else
chan = CHAN_VOICE;
// use a positioned_sound, because this entity won't normally be
// sent to any clients because it is invisible
gi.positioned_sound (ent->s.origin, ent, chan, ent->noise_index, ent->volume, ent->attenuation, 0);
{ // normal sound
if (ent->spawnflags & 4)
chan = CHAN_VOICE|CHAN_RELIABLE;
else
chan = CHAN_VOICE;
// use a positioned_sound, because this entity won't normally be
// sent to any clients because it is invisible
gi.positioned_sound (ent->s.origin, ent, chan, ent->noise_index, ent->volume, ent->attenuation, 0);
}
ent->count--;
if (!ent->count) {
ent->think = G_FreeEdict;
ent->nextthink = level.time + 1;
}
}
}

View file

@ -886,10 +886,10 @@ void SP_trigger_gravity (edict_t *self)
// self->gravity = atoi(st.gravity);
self->gravity = atof(st.gravity);
if(self->spawnflags & 1) // TOGGLE
if (self->spawnflags & 1) // TOGGLE
self->use = trigger_gravity_use;
if(self->spawnflags & 2) // START_OFF
if (self->spawnflags & 2) // START_OFF
{
self->use = trigger_gravity_use;
self->solid = SOLID_NOT;

200
missionpack/m_vulture.h Normal file
View file

@ -0,0 +1,200 @@
// Generated by ModelEd
// Vulture
#define FRAME_perch1 0
#define FRAME_perch2 1
#define FRAME_perch3 2
#define FRAME_perch4 3
#define FRAME_perch5 4
#define FRAME_perch6 5
#define FRAME_perch7 6
#define FRAME_perch8 7
#define FRAME_perch9 8
#define FRAME_perch10 9
#define FRAME_perch11 10
#define FRAME_perch12 11
#define FRAME_perch13 12
#define FRAME_perch14 13
#define FRAME_perch15 14
#define FRAME_perch16 15
#define FRAME_perch17 16
#define FRAME_perch18 17
#define FRAME_perch19 18
#define FRAME_perch20 19
#define FRAME_perch21 20
#define FRAME_perch22 21
#define FRAME_perch23 22
#define FRAME_perch24 23
#define FRAME_perch25 24
#define FRAME_perch26 25
#define FRAME_perch27 26
#define FRAME_perch28 27
#define FRAME_perch29 28
#define FRAME_perch30 29
#define FRAME_walk1 30
#define FRAME_walk2 31
#define FRAME_walk3 32
#define FRAME_walk4 33
#define FRAME_walk5 34
#define FRAME_walk6 35
#define FRAME_walk7 36
#define FRAME_walk8 37
#define FRAME_walk9 38
#define FRAME_walk10 39
#define FRAME_soar1 40
#define FRAME_soar2 41
#define FRAME_soar3 42
#define FRAME_soar4 43
#define FRAME_soar5 44
#define FRAME_soar6 45
#define FRAME_soar7 46
#define FRAME_soar8 47
#define FRAME_soar9 48
#define FRAME_soar10 49
#define FRAME_soar11 50
#define FRAME_soar12 51
#define FRAME_soar13 52
#define FRAME_soar14 53
#define FRAME_soar15 54
#define FRAME_soar16 55
#define FRAME_soar17 56
#define FRAME_soar18 57
#define FRAME_soar19 58
#define FRAME_soar20 59
#define FRAME_soar21 60
#define FRAME_soar22 61
#define FRAME_soar23 62
#define FRAME_soar24 63
#define FRAME_soar25 64
#define FRAME_soar26 65
#define FRAME_soar27 66
#define FRAME_soar28 67
#define FRAME_soar29 68
#define FRAME_soar30 69
#define FRAME_soar31 70
#define FRAME_soar32 71
#define FRAME_soar33 72
#define FRAME_soar34 73
#define FRAME_soar35 74
#define FRAME_soar36 75
#define FRAME_soar37 76
#define FRAME_soar38 77
#define FRAME_soar39 78
#define FRAME_soar40 79
#define FRAME_soar41 80
#define FRAME_soar42 81
#define FRAME_pain1 82
#define FRAME_pain2 83
#define FRAME_pain3 84
#define FRAME_pain4 85
#define FRAME_soarpain1 86
#define FRAME_soarpain2 87
#define FRAME_soarpain3 88
#define FRAME_soarpain4 89
#define FRAME_die1 90
#define FRAME_die2 91
#define FRAME_die3 92
#define FRAME_die4 93
#define FRAME_soardie1 94
#define FRAME_soardie2 95
#define FRAME_soardie3 96
#define FRAME_soardie4 97
#define FRAME_soardie5 98
#define FRAME_soardie6 99
#define FRAME_soardie7 100
#define FRAME_soardie8 101
#define FRAME_soardie9 102
#define FRAME_soardie10 103
#define FRAME_soardie11 104
#define FRAME_soardie12 105
#define FRAME_soardie13 106
#define FRAME_soardie14 107
#define FRAME_soardie15 108
#define FRAME_soardie16 109
#define FRAME_soardie17 110
#define FRAME_soardie18 111
#define FRAME_soardie19 112
#define FRAME_soardie20 113
#define FRAME_soardie21 114
#define FRAME_soardie22 115
#define FRAME_soardie23 116
#define FRAME_soardie24 117
#define FRAME_soardie25 118
#define FRAME_soardie26 119
#define FRAME_soardie27 120
#define FRAME_soardie28 121
#define FRAME_soardie29 122
#define FRAME_soardie30 123
#define FRAME_takeoff1 124
#define FRAME_takeoff2 125
#define FRAME_takeoff3 126
#define FRAME_takeoff4 127
#define FRAME_takeoff5 128
#define FRAME_takeoff6 129
#define FRAME_fly1 130
#define FRAME_fly2 131
#define FRAME_fly3 132
#define FRAME_fly4 133
#define FRAME_fly5 134
#define FRAME_melee1 135
#define FRAME_melee2 136
#define FRAME_melee3 137
#define FRAME_melee4 138
#define FRAME_land1 139
#define FRAME_land2 140
#define FRAME_land3 141
#define FRAME_land4 142
#define FRAME_land5 143
#define FRAME_land6 144
#define FRAME_land7 145
#define FRAME_land8 146
#define FRAME_land9 147
#define FRAME_land10 148
#define FRAME_land11 149
#define FRAME_land12 150
#define FRAME_land13 151
#define FRAME_skin 152
#define FRAME_bankR1 153
#define FRAME_bankR2 154
#define FRAME_bankR3 155
#define FRAME_bankR4 156
#define FRAME_bankR5 157
#define FRAME_bankR6 158
#define FRAME_bankR7 159
#define FRAME_bankR8 160
#define FRAME_bankR9 161
#define FRAME_bankR10 162
#define FRAME_bankL1 163
#define FRAME_bankL2 164
#define FRAME_bankL3 165
#define FRAME_bankL4 166
#define FRAME_bankL5 167
#define FRAME_bankL6 168
#define FRAME_bankL7 169
#define FRAME_bankL8 170
#define FRAME_bankL9 171
#define FRAME_bankL10 172
#define FRAME_TEMPLATE1 173
#define FRAME_perchSAFE1 174
#define FRAME_flySAFE1 175
#define FRAME_flySAFE2 176
#define FRAME_flySAFE3 177
#define FRAME_flySAFE4 178
#define FRAME_flySAFE5 179
#define FRAME_flySAFE6 180
#define FRAME_flySAFE7 181
#define FRAME_flySAFE8 182
#define FRAME_flySAFE9 183
#define FRAME_flySAFE10 184
#define FRAME_takeoffSAFE1 185
#define FRAME_takeoffSAFE2 186
#define FRAME_takeoffSAFE3 187
#define FRAME_takeoffSAFE4 188
#define FRAME_takeoffSAFE5 189
#define FRAME_takeoffSAFE6 190
#define FRAME_takeoffSAFE7 191
#define FRAME_takeoffSAFE8 192
#define FRAME_takeoffSAFE9 193
#define FRAME_takeoffSAFE10 194
#define MODEL_SCALE 1.000000

View file

@ -2281,6 +2281,10 @@ void PutClientInServer (edict_t *ent)
// copy some data from the client to the entity
FetchClientEntData (ent);
// Lazarus: Starting health < max. Presumably player was hurt in a crash
if( (spawn_health > 0) && !deathmatch->value && !coop->value)
ent->health = min(ent->health, spawn_health);
// clear entity values
ent->groundentity = NULL;
ent->client = &game.clients[index];