diff --git a/Source/Server/Client.c b/Source/Server/Client.c index 78fa0b0b..b1b7ea48 100644 --- a/Source/Server/Client.c +++ b/Source/Server/Client.c @@ -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 { diff --git a/Source/Server/Entities.c b/Source/Server/Entities.c index de502283..4d1fcc9e 100644 --- a/Source/Server/Entities.c +++ b/Source/Server/Entities.c @@ -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; diff --git a/Source/Server/FuncButton.c b/Source/Server/FuncButton.c new file mode 100644 index 00000000..4f418999 --- /dev/null +++ b/Source/Server/FuncButton.c @@ -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(); +} diff --git a/Source/Server/FuncDoor.c b/Source/Server/FuncDoor.c index 48c0af23..0fb453b7 100644 --- a/Source/Server/FuncDoor.c +++ b/Source/Server/FuncDoor.c @@ -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 ) ); diff --git a/Source/Server/FuncDoorRotating.c b/Source/Server/FuncDoorRotating.c index a12986e5..106e6037 100644 --- a/Source/Server/FuncDoorRotating.c +++ b/Source/Server/FuncDoorRotating.c @@ -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 ); diff --git a/Source/Server/Light.c b/Source/Server/Light.c new file mode 100644 index 00000000..b4b1d363 --- /dev/null +++ b/Source/Server/Light.c @@ -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; +} diff --git a/Source/Server/Main.c b/Source/Server/Main.c index 1ba56c27..cbab1231 100644 --- a/Source/Server/Main.c +++ b/Source/Server/Main.c @@ -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 ); diff --git a/Source/Server/progs.src b/Source/Server/progs.src index ec71c022..1f906d1f 100644 --- a/Source/Server/progs.src +++ b/Source/Server/progs.src @@ -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