quakec/source/server/entities/window.qc
2024-09-01 18:12:38 -07:00

431 lines
No EOL
17 KiB
C++

/*
server/entities/window.qc
Barricades
Copyright (C) 2021-2024 NZ:P Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to:
Free Software Foundation, Inc.
59 Temple Place - Suite 330
Boston, MA 02111-1307, USA
*/
.float rebuild_time;
#define BARRICADE_SPAWNFLAG_NOTREAL 1
void() spawn_boxes =
{
makevectors(self.angles);
self.box1 = self.origin + (v_forward * -30) + (v_up * -32);
self.box2 = self.box1 + (v_right * 30);
self.box3 = self.box1 + (v_right * -30);
self.idlebox = self.box1 + (v_forward * -30);
self.hop_spot = self.origin + v_forward * 40;
self.hop_spot_z -= 30;//We want this to be a little bit above the ground still
};
void() screen_shake =
{
local float r,s,zoom_factor;
r = crandom();
s = random();
if (self.enemy.zoom == 2 || self.enemy.zoom == 1)
zoom_factor = 0.25;
else
zoom_factor = 0.5;
self.enemy.punchangle_y = r * 4 * zoom_factor;
self.enemy.punchangle_x = (4 + (s * 2)) * zoom_factor;
};
void() Window_repaired =
{
if (barricade_reward_maximum > self.enemy.barricade_reward)
{
Sound_PlaySound(self.enemy, "sounds/misc/ching.wav", SOUND_TYPE_ENV_CHING, SOUND_PRIORITY_PLAYALWAYS);
Player_AddScore(self.enemy, 10, true);
self.enemy.barricade_reward += 10;
}
screen_shake();
self.enemy = world;
};
void() Barricade_hit_window =
{
Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS);
}
void(void() next) checkForSpeed = {
if (!(other.perks & P_SPEED))
return;
next();
}
//////////////////////////////////////////////////////////////////////////////////////////// ANIMATIONS
//0-6
//7-13
//14-20
//21-27
//28-34
//35-41
void() window_anim1_1 =[ 1, window_anim1_2 ] {self.frame = 0;self.nextthink = time + 0.05;};
void() window_anim1_2 =[ 2, window_anim1_3 ] {self.frame = 1;self.nextthink = time + 0.05;};
void() window_anim1_3 =[ 3, window_anim1_4 ] {self.frame = 2;self.nextthink = time + 0.05;};
void() window_anim1_4 =[ 4, window_anim1_5 ] {self.frame = 3;self.nextthink = time + 0.05;};
void() window_anim1_5 =[ 5, window_anim1_6 ] {self.frame = 4;self.nextthink = time + 0.05;};
void() window_anim1_6 =[ 6, window_anim1_7 ] {self.frame = 5;self.nextthink = time + 0.05;};
void() window_anim1_7 =[ 7, SUB_Null ] {self.frame = 6;self.nextthink = time + 0.05;};
void() window_anim2_1 =[ 1, window_anim2_2 ] {self.frame = 7;self.nextthink = time + 0.05;};
void() window_anim2_2 =[ 2, window_anim2_3 ] {self.frame = 8;self.nextthink = time + 0.05;};
void() window_anim2_3 =[ 3, window_anim2_4 ] {self.frame = 9;self.nextthink = time + 0.05;};
void() window_anim2_4 =[ 4, window_anim2_5 ] {self.frame = 10;self.nextthink = time + 0.05;};
void() window_anim2_5 =[ 5, window_anim2_6 ] {self.frame = 11;self.nextthink = time + 0.05;};
void() window_anim2_6 =[ 6, window_anim2_7 ] {self.frame = 12;self.nextthink = time + 0.05;};
void() window_anim2_7 =[ 7, SUB_Null ] {self.frame = 13;self.nextthink = time + 0.05;};
void() window_anim3_1 =[ 1, window_anim3_2 ] {self.frame = 14;self.nextthink = time + 0.05;};
void() window_anim3_2 =[ 2, window_anim3_3 ] {self.frame = 15;self.nextthink = time + 0.05;};
void() window_anim3_3 =[ 3, window_anim3_4 ] {self.frame = 16;self.nextthink = time + 0.05;};
void() window_anim3_4 =[ 4, window_anim3_5 ] {self.frame = 17;self.nextthink = time + 0.05;};
void() window_anim3_5 =[ 5, window_anim3_6 ] {self.frame = 18;self.nextthink = time + 0.05;};
void() window_anim3_6 =[ 6, window_anim3_7 ] {self.frame = 19;self.nextthink = time + 0.05;};
void() window_anim3_7 =[ 7, SUB_Null ] {self.frame = 20;self.nextthink = time + 0.05;};
void() window_anim4_1 =[ 1, window_anim4_2 ] {self.frame = 21;self.nextthink = time + 0.05;};
void() window_anim4_2 =[ 2, window_anim4_3 ] {self.frame = 22;self.nextthink = time + 0.05;};
void() window_anim4_3 =[ 3, window_anim4_4 ] {self.frame = 23;self.nextthink = time + 0.05;};
void() window_anim4_4 =[ 4, window_anim4_5 ] {self.frame = 24;self.nextthink = time + 0.05;};
void() window_anim4_5 =[ 5, window_anim4_6 ] {self.frame = 25;self.nextthink = time + 0.05;};
void() window_anim4_6 =[ 6, window_anim4_7 ] {self.frame = 26;self.nextthink = time + 0.05;};
void() window_anim4_7 =[ 7, SUB_Null ] {self.frame = 27;self.nextthink = time + 0.05;};
void() window_anim5_1 =[ 1, window_anim5_2 ] {self.frame = 28;self.nextthink = time + 0.05;};
void() window_anim5_2 =[ 2, window_anim5_3 ] {self.frame = 29;self.nextthink = time + 0.05;};
void() window_anim5_3 =[ 3, window_anim5_4 ] {self.frame = 30;self.nextthink = time + 0.05;};
void() window_anim5_4 =[ 4, window_anim5_5 ] {self.frame = 31;self.nextthink = time + 0.05;};
void() window_anim5_5 =[ 5, window_anim5_6 ] {self.frame = 32;self.nextthink = time + 0.05;};
void() window_anim5_6 =[ 6, window_anim5_7 ] {self.frame = 33;self.nextthink = time + 0.05;};
void() window_anim5_7 =[ 7, SUB_Null ] {self.frame = 34;self.nextthink = time + 0.05;};
void() window_anim6_1 =[ 1, window_anim6_2 ] {self.frame = 35;self.nextthink = time + 0.05;};
void() window_anim6_2 =[ 2, window_anim6_3 ] {self.frame = 36;self.nextthink = time + 0.05;};
void() window_anim6_3 =[ 3, window_anim6_4 ] {self.frame = 37;self.nextthink = time + 0.05;};
void() window_anim6_4 =[ 4, window_anim6_5 ] {self.frame = 38;self.nextthink = time + 0.05;};
void() window_anim6_5 =[ 5, window_anim6_6 ] {self.frame = 39;self.nextthink = time + 0.05;};
void() window_anim6_6 =[ 6, window_anim6_7 ] {self.frame = 40;self.nextthink = time + 0.05;};
void() window_anim6_7 =[ 7, SUB_Null ] {self.frame = 41;self.nextthink = time + 0.05;};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//speed cola repair
//81-88
void() window_srepair1_1 =[ 1, window_srepair1_2 ] {self.frame = 81;};
void() window_srepair1_2 =[ 2, window_srepair1_4 ] {self.frame = 84;};
void() window_srepair1_4 =[ 3, window_srepair1_5 ] {self.frame = 87;Barricade_hit_window();};
void() window_srepair1_5 =[ 4, SUB_Null ] {self.frame = 88; Window_repaired();};
//73-80
void() window_srepair2_1 =[ 1, window_srepair2_2 ] {self.frame = 73;};
void() window_srepair2_2 =[ 2, window_srepair2_4 ] {self.frame = 75;};
void() window_srepair2_4 =[ 3, window_srepair2_5 ] {self.frame = 79;Barricade_hit_window();};
void() window_srepair2_5 =[ 4, SUB_Null ] {self.frame = 80; Window_repaired();};
//65-72
void() window_srepair3_1 =[ 1, window_srepair3_2 ] {self.frame = 65;};
void() window_srepair3_2 =[ 2, window_srepair3_4 ] {self.frame = 67;};
void() window_srepair3_4 =[ 3, window_srepair3_5 ] {self.frame = 71;Barricade_hit_window();};
void() window_srepair3_5 =[ 4, SUB_Null ] {self.frame = 72; Window_repaired();};
//57-64
void() window_srepair4_1 =[ 1, window_srepair4_2 ] {self.frame = 57;};
void() window_srepair4_2 =[ 2, window_srepair4_4 ] {self.frame = 69;};
void() window_srepair4_4 =[ 3, window_srepair4_5 ] {self.frame = 63;Barricade_hit_window();};
void() window_srepair4_5 =[ 4, SUB_Null ] {self.frame = 64; Window_repaired();};
//49-56
void() window_srepair5_1 =[ 1, window_srepair5_2 ] {self.frame = 49;};
void() window_srepair5_2 =[ 2, window_srepair5_4 ] {self.frame = 51;};
void() window_srepair5_4 =[ 3, window_srepair5_5 ] {self.frame = 55;Barricade_hit_window();};
void() window_srepair5_5 =[ 4, SUB_Null ] {self.frame = 56; Window_repaired();};
//41-48
void() window_srepair6_1 =[ 1, window_srepair6_2 ] {self.frame = 41;};
void() window_srepair6_2 =[ 2, window_srepair6_4 ] {self.frame = 43;};
void() window_srepair6_4 =[ 3, window_srepair6_5 ] {self.frame = 47;Barricade_hit_window();};
void() window_srepair6_5 =[ 4, SUB_Null ] {self.frame = 48; Window_repaired();};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void() window_repair1_1 =[ 1, window_repair1_2 ] {self.frame = 81;};
void() window_repair1_2 =[ 2, window_repair1_3 ] {self.frame = 82;};
void() window_repair1_3 =[ 3, window_repair1_4 ] {self.frame = 83;};
void() window_repair1_4 =[ 4, window_repair1_5 ] {self.frame = 84;};
void() window_repair1_5 =[ 5, window_repair1_6 ] {self.frame = 85;};
void() window_repair1_6 =[ 6, window_repair1_7 ] {self.frame = 86;};
void() window_repair1_7 =[ 7, window_repair1_8 ] {self.frame = 87;Barricade_hit_window();};
void() window_repair1_8 =[ 8, SUB_Null ] {self.frame = 88; Window_repaired();};
void() window_repair2_1 =[ 1, window_repair2_2 ] {self.frame = 73;};
void() window_repair2_2 =[ 2, window_repair2_3 ] {self.frame = 74;};
void() window_repair2_3 =[ 3, window_repair2_4 ] {self.frame = 75;};
void() window_repair2_4 =[ 4, window_repair2_5 ] {self.frame = 76;};
void() window_repair2_5 =[ 5, window_repair2_6 ] {self.frame = 77;};
void() window_repair2_6 =[ 6, window_repair2_7 ] {self.frame = 78;};
void() window_repair2_7 =[ 7, window_repair2_8 ] {self.frame = 79;Barricade_hit_window();};
void() window_repair2_8 =[ 8, SUB_Null ] {self.frame = 80; Window_repaired();};
void() window_repair3_1 =[ 1, window_repair3_2 ] {self.frame = 65;};
void() window_repair3_2 =[ 2, window_repair3_3 ] {self.frame = 66;};
void() window_repair3_3 =[ 3, window_repair3_4 ] {self.frame = 67;};
void() window_repair3_4 =[ 4, window_repair3_5 ] {self.frame = 68;};
void() window_repair3_5 =[ 5, window_repair3_6 ] {self.frame = 69;};
void() window_repair3_6 =[ 6, window_repair3_7 ] {self.frame = 70;};
void() window_repair3_7 =[ 7, window_repair3_8 ] {self.frame = 71;Barricade_hit_window();};
void() window_repair3_8 =[ 8, SUB_Null ] {self.frame = 72; Window_repaired();};
void() window_repair4_1 =[ 1, window_repair4_2 ] {self.frame = 57;};
void() window_repair4_2 =[ 2, window_repair4_3 ] {self.frame = 58;};
void() window_repair4_3 =[ 3, window_repair4_4 ] {self.frame = 59;};
void() window_repair4_4 =[ 4, window_repair4_5 ] {self.frame = 60;};
void() window_repair4_5 =[ 5, window_repair4_6 ] {self.frame = 61;};
void() window_repair4_6 =[ 6, window_repair4_7 ] {self.frame = 62;};
void() window_repair4_7 =[ 7, window_repair4_8 ] {self.frame = 63;Barricade_hit_window();};
void() window_repair4_8 =[ 8, SUB_Null ] {self.frame = 64; Window_repaired();};
void() window_repair5_1 =[ 1, window_repair5_2 ] {self.frame = 49;};
void() window_repair5_2 =[ 2, window_repair5_3 ] {self.frame = 50;};
void() window_repair5_3 =[ 3, window_repair5_4 ] {self.frame = 51;};
void() window_repair5_4 =[ 4, window_repair5_5 ] {self.frame = 52;};
void() window_repair5_5 =[ 5, window_repair5_6 ] {self.frame = 53;};
void() window_repair5_6 =[ 6, window_repair5_7 ] {self.frame = 54;};
void() window_repair5_7 =[ 7, window_repair5_8 ] {self.frame = 55;Barricade_hit_window();};
void() window_repair5_8 =[ 8, SUB_Null ] {self.frame = 56; Window_repaired();};
void() window_repair6_1 =[ 1, window_repair6_2 ] {self.frame = 41;};
void() window_repair6_2 =[ 2, window_repair6_3 ] {self.frame = 42;};
void() window_repair6_3 =[ 3, window_repair6_4 ] {self.frame = 43;};
void() window_repair6_4 =[ 4, window_repair6_5 ] {self.frame = 44;};
void() window_repair6_5 =[ 5, window_repair6_6 ] {self.frame = 45;};
void() window_repair6_6 =[ 6, window_repair6_7 ] {self.frame = 46;};
void() window_repair6_7 =[ 7, window_repair6_8 ] {self.frame = 47;Barricade_hit_window();};
void() window_repair6_8 =[ 8, SUB_Null ] {self.frame = 48; Window_repaired();};
void() window_carpenter_1 =[ 1, window_carpenter_2 ] {self.frame = 47; Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS); };
void() window_carpenter_2 =[ 2, window_carpenter_3 ] {self.frame = 48;};
void() window_carpenter_3 =[ 3, window_carpenter_4 ] {self.frame = 55; Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS); };
void() window_carpenter_4 =[ 4, window_carpenter_5 ] {self.frame = 56;};
void() window_carpenter_5 =[ 5, window_carpenter_6 ] {self.frame = 63; Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS); };
void() window_carpenter_6 =[ 6, window_carpenter_7 ] {self.frame = 64;};
void() window_carpenter_7 =[ 7, window_carpenter_8 ] {self.frame = 71; Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS); };
void() window_carpenter_8 =[ 8, window_carpenter_9 ] {self.frame = 72;};
void() window_carpenter_9 =[ 7, window_carpenter_10 ] {self.frame = 79; Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS); };
void() window_carpenter_10 =[ 8, window_carpenter_11 ] {self.frame = 80;};
void() window_carpenter_11 =[ 7, window_carpenter_12 ] {self.frame = 87; Sound_PlaySound(self, self.oldmodel, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS); };
void() window_carpenter_12 =[ 8, SUB_Null ] {self.frame = 88;self.isspec = 0;};
void() Window_Damage =
{
if(self.health == 0 || self.owner)
return;
Sound_PlaySound(self, self.aistatus, SOUND_TYPE_ENV_OBJECT, SOUND_PRIORITY_PLAYALWAYS);
self.health = self.health - 1;
if(self.health == 5)
{
window_anim1_1();
total_windows_down = total_windows_down + 1;
}
else if(self.health == 4)
window_anim2_1();
else if(self.health == 3)
window_anim3_1();
else if(self.health == 2)
window_anim4_1();
else if(self.health == 1)
window_anim5_1();
else if(self.health == 0)
window_anim6_1();
ach_tracker_spin = 1;
};
void() Rebuild_Anims =
{
if(self.health == 5)
{
if (other.perks & P_SPEED)
window_srepair1_1();
else
window_repair1_1();
total_windows_down = total_windows_down - 1;
}
else if(self.health == 4)
{
if (other.perks & P_SPEED)
window_srepair2_1();
else
window_repair2_1();
}
else if(self.health == 3)
{
if (other.perks & P_SPEED)
window_srepair3_1();
else
window_repair3_1();
}
else if(self.health == 2)
{
if (other.perks & P_SPEED)
window_srepair4_1();
else
window_repair4_1();
}
else if(self.health == 1)
{
if (other.perks & P_SPEED)
window_srepair5_1();
else
window_repair5_1();
}
else if(self.health == 0)
{
if (other.perks & P_SPEED)
window_srepair6_1();
else
window_repair6_1();
}
};
void() window_touch =
{
if (self.owner)
return;
if(other.classname == "player" && !other.downed && self.health != -10)
{
// cypress (09 dec 2023) -- support for limited barricade health.
if(self.health < self.health_delay)
{
useprint (other, 5, 0, 0);
if(other.button7)
{
if(self.rebuild_time < time)
{
self.enemy = other;
Rebuild_Anims();
self.health = self.health + 1;
self.rebuild_time = time + 0.75;
}
}
}
}
};
//
// Barricade_GetFrameForHealth(barricade_health)
// What it says on the tin -- if we're spawning with only
// one board, make sure we're on the frame with only one board,
// two for two, etc.
//
float(float barricade_health) Barricade_GetFrameForHealth =
{
switch(barricade_health) {
case -1:
return 41;
case 1:
return 34;
case 2:
return 27;
case 3:
return 20;
case 4:
return 13;
case 5:
return 6;
case 6:
return 0;
default:
return 41;
}
return 0;
}
void() item_barricade =
{
if (self.spawnflags & BARRICADE_SPAWNFLAG_NOTREAL) {
self.health = -10; // Window is deactivated, to only hop over it
} else {
//
// Set Default Stats for Compatibility
//
// Model
if (!self.model)
self.model = "models/misc/window.mdl";
// Repair Sound
if (!self.oldmodel)
self.oldmodel = "sounds/misc/barricade.wav";
// Destroy Sound
if (!self.aistatus)
self.aistatus = "sounds/misc/barricade_destroy.wav";
// Starting Health (-1 = start none, needs to be this way for compatibility)
if (!self.health || self.health > 6 || self.health < -1)
self.health = 6;
// Max Health
if (!self.health_delay || self.health_delay > 6)
self.health_delay = 6;
// Restore health state if using compatibility hack
if (self.health == -1) self.health = 0;
if (self.health_delay == -1) self.health_delay = 0;
// cypress -- i was going to add a check if the start health was greater
// than max here, but i figured someone might want to make a weird ass
// challenge map where barricades become irreperable after destruction..
// .. not a bad idea, actually.
precache_model(self.model);
precache_sound(self.oldmodel);
precache_sound(self.aistatus);
}
self.classname = "window";
self.touch = window_touch;
self.solid = SOLID_TRIGGER;
if (self.health != -10) {
self.frame = Barricade_GetFrameForHealth(self.health);
setmodel(self, self.model);
}
setsize(self, '-20 -20 -64', '20 20 16');
setorigin(self, self.origin);
spawn_boxes();
};