Added func_button and a ton of compatibility fixes, as well as lightswitches
This commit is contained in:
parent
1fd279abaa
commit
f986f42c76
8 changed files with 370 additions and 28 deletions
|
@ -48,13 +48,14 @@ void PlayerPostThink( void ) {
|
|||
|
||||
void PutClientInServer( void ) {
|
||||
entity eSpawn;
|
||||
entity eTarget = world;
|
||||
eSpawn = find (world, classname, "trigger_camera");
|
||||
|
||||
self.origin = eSpawn.origin + '0 0 1';
|
||||
|
||||
// Rotate camera towards a target
|
||||
if( eSpawn.target ) {
|
||||
entity eTarget = find( eTarget, targetname, eSpawn.target );
|
||||
eTarget = find( eTarget, targetname, eSpawn.target );
|
||||
self.angles = vectoangles( eTarget.origin - eSpawn.origin );
|
||||
self.angles_x *= -1;
|
||||
} else {
|
||||
|
|
|
@ -219,10 +219,6 @@ void func_wall( void ) {
|
|||
Entities_RenderSetup();
|
||||
}
|
||||
|
||||
void func_button( void ) {
|
||||
func_wall();
|
||||
}
|
||||
|
||||
void func_illusionary( void ){
|
||||
func_wall();
|
||||
self.solid = SOLID_NOT;
|
||||
|
|
288
Source/Server/FuncButton.c
Normal file
288
Source/Server/FuncButton.c
Normal file
|
@ -0,0 +1,288 @@
|
|||
/*
|
||||
OpenCS Project
|
||||
Copyright (C) 2015 Marco "eukara" Hladik
|
||||
|
||||
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 the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
=================
|
||||
func_door Spawnflags
|
||||
=================
|
||||
*/
|
||||
|
||||
void() FuncButton_MoveAway;
|
||||
void() FuncButton_MoveBack;
|
||||
void() FuncButton_Touch;
|
||||
|
||||
#define SF_BTT_NOMOVE 1
|
||||
#define SF_BTT_TOGGLE 32
|
||||
#define SF_BTT_TOUCH_ONLY 256
|
||||
|
||||
enum {
|
||||
STATE_RAISED = 0,
|
||||
STATE_LOWERED,
|
||||
STATE_UP,
|
||||
STATE_DOWN
|
||||
};
|
||||
|
||||
.float speed;
|
||||
.float lip;
|
||||
.float dmg;
|
||||
.float state;
|
||||
.vector pos1, pos2;
|
||||
|
||||
// Not all that customizable...
|
||||
.float movesnd;
|
||||
.float stopsnd;
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_PrecacheSounds
|
||||
====================
|
||||
*/
|
||||
void FuncButton_PrecacheSounds( void ) {
|
||||
string sSample = "buttons/button9.wav";
|
||||
|
||||
switch( self.sounds ) {
|
||||
case 0:
|
||||
sSample = "common/null.wav";
|
||||
break;
|
||||
case 1:
|
||||
sSample = "buttons/button1.wav";
|
||||
break;
|
||||
case 2:
|
||||
sSample = "buttons/button2.wav";
|
||||
break;
|
||||
case 3:
|
||||
sSample = "buttons/button3.wav";
|
||||
break;
|
||||
case 4:
|
||||
sSample = "buttons/button4.wav";
|
||||
break;
|
||||
case 5:
|
||||
sSample = "buttons/button5.wav";
|
||||
break;
|
||||
case 6:
|
||||
sSample = "buttons/button6.wav";
|
||||
break;
|
||||
case 7:
|
||||
sSample = "buttons/button7.wav";
|
||||
break;
|
||||
case 8:
|
||||
sSample = "buttons/button8.wav";
|
||||
break;
|
||||
case 9:
|
||||
sSample = "buttons/button9.wav";
|
||||
break;
|
||||
case 10:
|
||||
sSample = "buttons/button10.wav";
|
||||
break;
|
||||
case 11:
|
||||
sSample = "buttons/button11.wav";
|
||||
break;
|
||||
case 12:
|
||||
sSample = "buttons/latchlocked1.wav";
|
||||
break;
|
||||
case 13:
|
||||
sSample = "buttons/latchunlocked1.wav";
|
||||
break;
|
||||
case 14:
|
||||
sSample = "buttons/lightswitch2.wav";
|
||||
break;
|
||||
case 21:
|
||||
sSample = "buttons/lever1.wav";
|
||||
break;
|
||||
case 22:
|
||||
sSample = "buttons/lever2.wav";
|
||||
break;
|
||||
case 23:
|
||||
sSample = "buttons/lever3.wav";
|
||||
break;
|
||||
case 24:
|
||||
sSample = "buttons/lever4.wav";
|
||||
break;
|
||||
case 25:
|
||||
sSample = "buttons/lever5.wav";
|
||||
break;
|
||||
}
|
||||
precache_sound( sSample );
|
||||
self.noise = sSample;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_Arrived
|
||||
====================
|
||||
*/
|
||||
void FuncButton_Arrived( void ) {
|
||||
self.state = STATE_RAISED;
|
||||
|
||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
||||
self.touch = FuncButton_Touch;
|
||||
}
|
||||
if ( self.spawnflags & SF_BTT_TOGGLE ) {
|
||||
return;
|
||||
}
|
||||
|
||||
Entities_UseTargets();
|
||||
self.think = FuncButton_MoveBack;
|
||||
self.nextthink = ( self.ltime + self.wait );
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_Returned
|
||||
====================
|
||||
*/
|
||||
void FuncButton_Returned( void ) {
|
||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
||||
self.touch = FuncButton_Touch;
|
||||
}
|
||||
|
||||
self.state = STATE_LOWERED;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_MoveBack
|
||||
====================
|
||||
*/
|
||||
void FuncButton_MoveBack( void ) {
|
||||
|
||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
||||
self.touch = __NULL__;
|
||||
}
|
||||
|
||||
self.state = STATE_DOWN;
|
||||
Entities_MoveToDestination ( self.pos1, self.speed, FuncButton_Returned );
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_MoveAway
|
||||
====================
|
||||
*/
|
||||
void FuncButton_MoveAway( void ) {
|
||||
if ( self.state == STATE_UP ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( self.state == STATE_RAISED ) {
|
||||
self.nextthink = ( self.ltime + self.wait );
|
||||
return;
|
||||
}
|
||||
|
||||
self.state = STATE_UP;
|
||||
Entities_MoveToDestination ( self.pos2, self.speed, FuncButton_Arrived );
|
||||
Entities_UseTargets();
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_Trigger
|
||||
====================
|
||||
*/
|
||||
void FuncButton_Trigger( void ) {
|
||||
if ( ( self.state == STATE_UP ) || ( self.state == STATE_RAISED ) ){
|
||||
FuncButton_MoveBack();
|
||||
return;
|
||||
}
|
||||
|
||||
sound( self, CHAN_VOICE, self.noise, 1.0, ATTN_NORM );
|
||||
FuncButton_MoveAway();
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_Touch
|
||||
====================
|
||||
*/
|
||||
void FuncButton_Touch( void ) {
|
||||
if ( other.classname == "player" ) {
|
||||
FuncButton_Trigger();
|
||||
|
||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
||||
self.touch = __NULL__;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
FuncButton_Blocked
|
||||
====================
|
||||
*/
|
||||
void FuncButton_Blocked( void ) {
|
||||
if( self.dmg ) {
|
||||
Damage_Apply( other, self, self.dmg, other.origin );
|
||||
}
|
||||
|
||||
if ( self.wait >= 0 ) {
|
||||
if ( self.state == STATE_DOWN ) {
|
||||
FuncButton_MoveAway ();
|
||||
} else {
|
||||
FuncButton_MoveBack ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
func_button
|
||||
|
||||
Spawn function of a moving door entity
|
||||
====================
|
||||
*/
|
||||
|
||||
void func_button( void ) {
|
||||
FuncButton_PrecacheSounds();
|
||||
Entities_SetMovementDirection();
|
||||
self.solid = SOLID_BSP;
|
||||
self.movetype = MOVETYPE_PUSH;
|
||||
setorigin( self, self.origin );
|
||||
setmodel( self, self.model );
|
||||
|
||||
self.blocked = FuncButton_Blocked;
|
||||
self.vUse = FuncButton_Trigger;
|
||||
|
||||
if ( !self.speed ) {
|
||||
self.speed = 100;
|
||||
}
|
||||
if ( !self.wait ) {
|
||||
self.wait = 2;
|
||||
}
|
||||
if ( !self.dmg ) {
|
||||
self.dmg = 2;
|
||||
}
|
||||
|
||||
if ( !( self.spawnflags & SF_BTT_TOUCH_ONLY ) ) {
|
||||
self.touch = FuncButton_Touch;
|
||||
}
|
||||
|
||||
self.iUsable = TRUE;
|
||||
|
||||
self.pos1 = self.origin;
|
||||
|
||||
if ( self.spawnflags & SF_BTT_NOMOVE ) {
|
||||
self.pos2 = self.pos1;
|
||||
} else {
|
||||
self.pos2 = ( self.pos1 + self.movedir * ( fabs( self.movedir * self.size ) - self.lip ) );
|
||||
}
|
||||
|
||||
self.state = STATE_LOWERED;
|
||||
Entities_RenderSetup();
|
||||
}
|
|
@ -94,9 +94,15 @@ void FuncDoor_Arrived( void ) {
|
|||
if ( self.wait < 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.think = FuncDoor_MoveBack;
|
||||
self.nextthink = ( self.ltime + self.wait );
|
||||
|
||||
if ( self.target ) {
|
||||
Entities_UseTargets();
|
||||
}
|
||||
|
||||
if ( !( self.spawnflags & SF_MOV_TOGGLE ) ) {
|
||||
self.think = FuncDoor_MoveBack;
|
||||
self.nextthink = ( self.ltime + self.wait );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -109,6 +115,10 @@ void FuncDoor_Returned( void ) {
|
|||
self.touch = FuncDoor_Touch;
|
||||
}
|
||||
|
||||
if ( self.target ) {
|
||||
Entities_UseTargets();
|
||||
}
|
||||
|
||||
self.state = STATE_LOWERED;
|
||||
}
|
||||
|
||||
|
@ -119,7 +129,7 @@ FuncDoor_MoveBack
|
|||
*/
|
||||
void FuncDoor_MoveBack( void ) {
|
||||
|
||||
if( self.movesnd > 0 && self.movesnd <= 8 ) {
|
||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
||||
} else {
|
||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
||||
|
@ -143,15 +153,17 @@ void FuncDoor_MoveAway( void ) {
|
|||
return;
|
||||
}
|
||||
|
||||
if( self.movesnd > 0 && self.movesnd <= 8 ) {
|
||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
||||
} else {
|
||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
||||
}
|
||||
|
||||
if ( self.state == STATE_RAISED ) {
|
||||
self.nextthink = ( self.ltime + self.wait );
|
||||
return;
|
||||
if ( !( self.spawnflags & SF_MOV_TOGGLE ) ) {
|
||||
if ( self.state == STATE_RAISED ) {
|
||||
self.nextthink = ( self.ltime + self.wait );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
self.state = STATE_UP;
|
||||
|
@ -218,35 +230,31 @@ Spawn function of a moving door entity
|
|||
void func_door( void ) {
|
||||
FuncDoor_PrecacheSounds();
|
||||
Entities_SetMovementDirection();
|
||||
|
||||
self.solid = SOLID_BSP;
|
||||
|
||||
self.movetype = MOVETYPE_PUSH;
|
||||
setorigin( self, self.origin );
|
||||
setmodel( self, self.model );
|
||||
|
||||
self.blocked = FuncDoor_Blocked;
|
||||
self.use = FuncDoor_Trigger;
|
||||
self.vUse = FuncDoor_Trigger;
|
||||
|
||||
if ( !self.speed ) {
|
||||
self.speed = 100;
|
||||
}
|
||||
if ( !self.wait ) {
|
||||
self.wait = 2;
|
||||
}
|
||||
|
||||
if ( !self.dmg ) {
|
||||
self.dmg = 2;
|
||||
}
|
||||
if ( !self.style ) {
|
||||
self.style = ATTN_NORM;
|
||||
}
|
||||
|
||||
if ( !( self.spawnflags & SF_MOV_TOGGLE ) ) {
|
||||
if ( !( self.spawnflags & SF_MOV_USE ) ) {
|
||||
self.touch = FuncDoor_Touch;
|
||||
}
|
||||
|
||||
self.iUsable = TRUE;
|
||||
if ( !( self.spawnflags & SF_MOV_USE ) ) {
|
||||
self.touch = FuncDoor_Touch;
|
||||
}
|
||||
|
||||
self.iUsable = TRUE;
|
||||
|
||||
|
||||
self.pos1 = self.origin;
|
||||
self.pos2 = ( self.pos1 + self.movedir * ( fabs( self.movedir * self.size ) - self.lip ) );
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ FuncDoorRotate_RotateBack
|
|||
*/
|
||||
void FuncDoorRotate_RotateBack( void ) {
|
||||
|
||||
if( self.movesnd > 0 && self.movesnd <= 8 ) {
|
||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
||||
} else {
|
||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
||||
|
@ -110,7 +110,7 @@ void FuncDoorRotate_RotateAway( void ) {
|
|||
return;
|
||||
}
|
||||
|
||||
if( self.movesnd > 0 && self.movesnd <= 8 ) {
|
||||
if( self.movesnd > 0 && self.movesnd <= 10 ) {
|
||||
sound( self, CHAN_VOICE, sprintf( "doors/doormove%d.wav", self.movesnd ), 1.0, ATTN_NORM );
|
||||
} else {
|
||||
sound( self, CHAN_VOICE, "common/null.wav", 1.0, ATTN_NORM );
|
||||
|
|
34
Source/Server/Light.c
Normal file
34
Source/Server/Light.c
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
OpenCS Project
|
||||
Copyright (C) 2015 Marco "eukara" Hladik
|
||||
|
||||
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 the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
void light( void ) {
|
||||
static void light_toggle( void ) {
|
||||
if ( self.health == TRUE ) {
|
||||
lightstyle( self.style, "a" );
|
||||
self.health = FALSE;
|
||||
} else {
|
||||
lightstyle( self.style, "m" );
|
||||
self.health = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
self.vUse = light_toggle;
|
||||
self.health = TRUE;
|
||||
}
|
|
@ -243,6 +243,19 @@ void worldspawn( void ) {
|
|||
precache_sound( "weapons/xm1014-1.wav" );
|
||||
precache_sound( "weapons/zoom.wav" );
|
||||
|
||||
lightstyle( 0, "m" );
|
||||
lightstyle( 1, "mmnmmommommnonmmonqnmmo" );
|
||||
lightstyle( 2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba" );
|
||||
lightstyle( 3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg" );
|
||||
lightstyle( 4, "mamamamamama" );
|
||||
lightstyle( 5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj" );
|
||||
lightstyle( 6, "nmonqnmomnmomomno" );
|
||||
lightstyle( 7, "mmmaaaabcdefgmmmmaaaammmaamm" );
|
||||
lightstyle( 8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa" );
|
||||
lightstyle( 9, "aaaaaaaazzzzzzzz" );
|
||||
lightstyle( 10, "mmamammmmammamamaaamammma" );
|
||||
lightstyle( 11, "abcdefghijklmnopqrrqponmlkjihgfedcba" );
|
||||
|
||||
// TODO: Merge these into a single field?
|
||||
clientstat( STAT_BUYZONE, EV_FLOAT, fInBuyZone );
|
||||
clientstat( STAT_HOSTAGEZONE, EV_FLOAT, fInHostageZone );
|
||||
|
|
|
@ -51,9 +51,11 @@ FuncLadder.c
|
|||
FuncHostageRescue.c
|
||||
FuncBombTarget.c
|
||||
FuncBuyZone.c
|
||||
FuncButton.c
|
||||
FuncDoor.c
|
||||
FuncDoorRotating.c
|
||||
|
||||
Light.c
|
||||
Main.c
|
||||
Player.c
|
||||
Spawn.c
|
||||
|
|
Loading…
Reference in a new issue