Added info_map_parameters (setting buyrestrictions)

Added trigger_camera
Added ammo-buying restrictions (money wasn't taken into account)
Added spawning of buyzones when there aren't any
Added sound when buying ammo
Added Client_TriggerCamera as part of EV_CAMERATRIGGER
Fixed the Knife not showing/animating
This commit is contained in:
Marco Hladik 2016-12-07 01:05:06 +01:00
parent d8577accf0
commit 4f7defcb98
20 changed files with 293 additions and 39 deletions

View File

@ -41,5 +41,10 @@ vector vMousePos;
.string sSoundSample;
.float fVolume;
// Camera Fields
vector vCameraPos;
vector vCameraAngle;
float fCameraTime;
void View_PlayAnimation( int iSequence );
void Sound_Delayed( string sSample, float fVol, float fDelay );

View File

@ -34,7 +34,14 @@ void CSQC_UpdateView( float fWinWidth, float fWinHeight, float fGameFocus ) {
setproperty( VF_DRAWCROSSHAIR, 0 );
addentities( MASK_ENGINE );
View_DrawViewModel();
// When Cameratime is active, draw on the forced coords instead
if ( fCameraTime > time ) {
setproperty( VF_ORIGIN, vCameraPos) ;
setproperty( VF_ANGLES, vCameraAngle );
} else {
View_DrawViewModel();
}
renderscene();
if( fGameFocus == TRUE ) {

View File

@ -26,8 +26,8 @@ Init all the cmds in one place
=================
*/
void CSQC_ConsoleCommand_Init( void ) {
registercommand( "vgui_buymenu" );
registercommand( "vgui_teammenu" );
registercommand( "buy" );
registercommand( "chooseteam" );
registercommand( "use" );
}
@ -42,13 +42,13 @@ float CSQC_ConsoleCommand( string sCMD ) {
tokenize( sCMD );
switch ( argv(0) )
{
case "vgui_buymenu":
case "buy":
if( getstatf( STAT_BUYZONE ) == TRUE ) {
fVGUI_Display = VGUI_BM_MAIN;
}
return TRUE;
break;
case "vgui_teammenu":
case "chooseteam":
if( getstatf( STAT_TEAM ) == 0 ) {
fVGUI_Display = VGUI_TEAMSELECT;
}
@ -94,6 +94,17 @@ void CSQC_Parse_Event( void ) {
float fStyle = readbyte();
Effect_BreakModel( vPos, vSize, '0 0 0', fStyle );
} else if ( fHeader == EV_CAMERATRIGGER ) {
vCameraPos_x = readcoord();
vCameraPos_y = readcoord();
vCameraPos_z = readcoord();
vCameraAngle_x = readcoord();
vCameraAngle_y = readcoord();
vCameraAngle_z = readcoord();
fCameraTime = time + readfloat();
}
}

View File

@ -18,6 +18,7 @@ Defs.h
../Shared/WeaponFiveSeven.c
../Shared/WeaponG3SG1.c
../Shared/WeaponGlock18.c
../Shared/WeaponKnife.c
../Shared/WeaponM3.c
../Shared/WeaponM4A1.c
../Shared/WeaponMac10.c

View File

@ -166,6 +166,7 @@ enum {
EV_WEAPON_SECONDARYATTACK,
EV_WEAPON_RELOAD,
EV_MODELGIB,
EV_CAMERATRIGGER
};
// Submodel materials

View File

@ -59,6 +59,10 @@ void Ammo_BuySecondary( void ) {
float fNew = ceil( ( (float)iRequiredAmmo / (float)ammoTable[ wptTable[ self.iSlotSecondary ].iCaliber ].iSize ) );
for ( int i = 0; i < fNew; i++ ) {
if ( self.fMoney - ammoTable[ wptTable[ self.iSlotSecondary ].iCaliber ].iPrice < 0 ) {
break;
}
self.(wptTable[ self.iSlotSecondary ].iCaliberfld) += ammoTable[ wptTable[ self.iSlotSecondary ].iCaliber ].iSize;
self.fMoney -= ammoTable[ wptTable[ self.iSlotSecondary ].iCaliber ].iPrice;
@ -79,6 +83,7 @@ void CSEv_GamePlayerBuyAmmo_f( float fType ) {
Ammo_BuySecondary();
}
sound( self, CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
Weapon_UpdateCurrents();
self.fAttackFinished = time + 1.0;
}

View File

@ -47,23 +47,8 @@ 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 ) {
eTarget = find( eTarget, targetname, eSpawn.target );
self.angles = vectoangles( eTarget.origin - eSpawn.origin );
self.angles_x *= -1;
} else {
self.angles = eSpawn.angles;
}
self.fixangle = TRUE;
self.classname = "spectator";
Spawn_MakeSpectator();
// Because we don't want to reset these when we die
@ -96,3 +81,21 @@ void Client_SendEvent( entity eClient, float fEVType ) {
msg_entity = eClient;
multicast( '0 0 0', MULTICAST_ONE );
}
void Client_TriggerCamera( entity eTarget, vector vPos, vector vEndPos, float fResetTime ) {
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
WriteByte( MSG_MULTICAST, EV_CAMERATRIGGER );
WriteCoord( MSG_MULTICAST, vPos_x );
WriteCoord( MSG_MULTICAST, vPos_y );
WriteCoord( MSG_MULTICAST, vPos_z );
WriteCoord( MSG_MULTICAST, vEndPos_x );
WriteCoord( MSG_MULTICAST, vEndPos_y );
WriteCoord( MSG_MULTICAST, vEndPos_z );
WriteFloat( MSG_MULTICAST, fResetTime );
msg_entity = eTarget;
multicast( '0 0 0', MULTICAST_ONE );
}

View File

@ -46,29 +46,26 @@ float EFFECT_BLOOD;
// Match specific fields
int iWon_T;
int iWon_CT;
int iAlivePlayers_T;
int iAlivePlayers_CT;
int fOldInGamePlayers;
float fGameState;
float fGameTime;
// Weapon specific fields
.int iCurrentClip;
.int iCurrentCaliber;
.int iSlotMelee, iSlotPrimary, iSlotSecondary, iSlotGrenade;
.float fAttackFinished;
.float fAccuracy;
// Game specific fields
int iHostagesMax;
int iHostagesRescued;
int iBombZones;
int iRescueZones;
int iBuyZones;
int iBuyRestriction; // For info_map_parameters
// Generic entity fields
.int iUsable;
@ -105,6 +102,7 @@ void Spawn_RespawnClient( float fTeam );
void Spawn_CreateClient( float fTeam );
void Spawn_MakeSpectator( void );
void Client_SendEvent( entity eClient, float fEVType );
void Client_TriggerCamera( entity eTarget, vector vPos, vector vEndPos, float fResetTime );
void Weapon_SwitchBest( void );
void OpenCSGunBase_AccuracyCalc( void );

View File

@ -216,7 +216,7 @@ void Entities_RenderSetup( void ) {
if ( self.rendermode == RENDERMODE_ADDITIVE ) {
self.effects = EF_ADDITIVE;
} else if ( self.rendermode == RENDERMODE_GLOW ) {
self.effects = EF_FULLBRIGHT;
self.effects = EF_ADDITIVE | EF_FULLBRIGHT;
}
}
}

View File

@ -31,9 +31,7 @@ void func_bomb_target_touch( void ) {
/*
=================
SPAWN: func_hostage_rescue
Entry function for the rescue area-markings.
SPAWN: func_bomb_target
=================
*/
void func_bomb_target( void ) {

View File

@ -40,7 +40,59 @@ void func_buyzone( void ) {
self.angles = '0 0 0';
self.movetype = MOVETYPE_NONE;
self.solid = SOLID_TRIGGER;
setmodel (self, self.model);
if ( self.model ) {
setmodel( self, self.model );
} else {
self.mins = '-128 -128 -36';
self.maxs = '128 128 36';
setsize( self, self.mins, self.maxs );
}
self.model = 0;
self.touch = func_buyzone_touch;
iBuyZones++;
}
/*
=================
Game_CreateBuyZones
Called by StartFrame if we somehow got no buy zones
=================
*/
void Game_CreateBuyZones( void ) {
entity eOldSelf;
entity eFind;
if ( iBuyRestriction == BUY_T || iBuyRestriction == BUY_BOTH ) {
eFind = findchain( classname, "info_player_start" );
while ( eFind ) {
entity eBuyZoneT = spawn();
setorigin( eBuyZoneT, eFind.origin );
eOldSelf = self;
self = eBuyZoneT;
func_buyzone();
self.team = TEAM_T;
self = eOldSelf;
eFind = eFind.chain;
}
}
if ( iBuyRestriction == BUY_CT || iBuyRestriction == BUY_BOTH ) {
eFind = findchain( classname, "info_player_start" );
while ( eFind ) {
entity eBuyZoneCT = spawn();
setorigin( eBuyZoneCT, eFind.origin );
eOldSelf = self;
self = eBuyZoneCT;
func_buyzone();
self.team = TEAM_CT;
self = eOldSelf;
eFind = eFind.chain;
}
}
}

View File

@ -25,11 +25,16 @@ void SetChangeParms( void ) {}
// Run every frame... by world?
void StartFrame( void ) {
// We've got hostages, but no rescue zones, create some
if ( !iRescueZones && iHostagesMax > 0 ) {
Game_CreateRescueZones();
}
if ( iBuyZones == 0 ) {
Game_CreateBuyZones();
}
int iInGamePlayers;
// Sigh, check if clients are in the game
if ( find( world, classname , "player" ) != world ) {
@ -85,6 +90,8 @@ void worldspawn( void ) {
precache_sound( "hostage/hos4.wav" );
precache_sound( "hostage/hos5.wav" );
precache_sound( "items/9mmclip1.wav" );
precache_sound( "weapons/ak47-1.wav" );
precache_sound( "weapons/ak47-2.wav" );
precache_sound( "weapons/ak47_boltpull.wav" );

View File

@ -32,6 +32,8 @@ void Player_Death( void ) {
eCorpse.frame = 93; // TODO: Pick the right frame
Spawn_MakeSpectator();
self.classname = "player";
self.health = 0;
if ( self.team == TEAM_T ) {
iAlivePlayers_T--;

View File

@ -18,6 +18,13 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
enum {
BUY_BOTH,
BUY_CT,
BUY_T,
BUY_NEITHER
};
// Checks if it is possible for players to buy anything
float Rules_BuyingPossible( void ) {
if ( fGameState == GAME_ACTIVE ) {
@ -28,6 +35,24 @@ float Rules_BuyingPossible( void ) {
}
}
if ( iBuyRestriction == BUY_NEITHER ) {
centerprint( self, "Sorry, you aren't meant to be buying anything.\n" );
self.fAttackFinished = time + 1.0;
return FALSE;
}
if ( iBuyRestriction != BUY_BOTH ) {
if ( iBuyRestriction == BUY_CT && self.team == TEAM_T ) {
centerprint( self, "Terrorists aren't allowed to buy anything!\n" );
self.fAttackFinished = time + 1.0;
return FALSE;
} else if ( iBuyRestriction == BUY_T && self.team == TEAM_CT ) {
centerprint( self, "Counter-Terrorists aren't allowed to buy anything!\n" );
self.fAttackFinished = time + 1.0;
return FALSE;
}
}
return TRUE;
}
@ -80,3 +105,16 @@ void Rules_TimeOver( void ) {
Rules_RoundOver( 0 );
}
}
/*
=================
SPAWN: info_map_parameters
Let's map authors decide who can buy stuff and who CAN'T.
Also allows people to set the bomb placing radius incase you want to use info_bomb_target.
=================
*/
.float buying;
void info_map_parameters( void ) {
iBuyRestriction = self.buying;
}

View File

@ -95,6 +95,7 @@ void Spawn_CreateClient( float fCharModel ) {
self.team = TEAM_T;
iAlivePlayers_T++;
Weapon_AddItem( WEAPON_KNIFE );
Weapon_AddItem( WEAPON_GLOCK18 );
Weapon_GiveAmmo( WEAPON_GLOCK18, 40 );
//Weapon_AddItem( WEAPON_C4BOMB );
@ -102,6 +103,7 @@ void Spawn_CreateClient( float fCharModel ) {
self.team = TEAM_CT;
iAlivePlayers_CT++;
Weapon_AddItem( WEAPON_KNIFE );
Weapon_AddItem( WEAPON_USP45 );
Weapon_GiveAmmo( WEAPON_USP45, 24 );
}
@ -116,6 +118,9 @@ void Spawn_CreateClient( float fCharModel ) {
// This is called on connect and whenever a player dies
void Spawn_MakeSpectator( void ) {
entity eSpawn;
self.classname = "spectator";
self.health = 0;
self.takedamage = DAMAGE_NO;
self.solid = SOLID_NOT;
@ -130,6 +135,17 @@ void Spawn_MakeSpectator( void ) {
forceinfokey( self, "*spectator", "1" ); // Make sure we are known as a spectator
// Go find a camera if we aren't dead
eSpawn = find (world, classname, "trigger_camera");
if ( eSpawn ) {
self.origin = eSpawn.origin + '0 0 1';
self.angles = eSpawn.angles;
//self.angles_x = eSpawn.angles_x * -1;
}
self.fixangle = TRUE;
// Clear all the ammo stuff
for ( int i = 0; i < CS_WEAPON_COUNT; i++ ) {
self.(wptTable[ i ].iClipfld) = 0;
@ -157,10 +173,10 @@ void CSEv_GamePlayerSpawn_f( float fChar ) {
self.team = TEAM_CT;
}
Spawn_MakeSpectator();
self.classname = "player";
self.fCharModel = fChar;
self.health = 0;
Spawn_MakeSpectator();
break;
default:
self.fCharModel = fChar;
@ -178,7 +194,4 @@ void info_player_start( void ) {
void info_player_deathmatch( void ) {
}
// Spectator Spawnpoints
void trigger_camera( void ) {
}
void info_target( void ) { }

View File

@ -70,6 +70,26 @@ void trigger_multiple( void ) {
self.touch = trigger_multiple_touch;
}
/*
=================
trigger_camera
=================
*/
void trigger_camera( void ) {
static void trigger_camera_use( void ) {
Client_TriggerCamera( eActivator, self.origin, self.angles, self.wait );
}
entity eTarget;
eTarget = find( world, targetname, self.target );
if( self.target ) {
self.angles = vectoangles( eTarget.origin - self.origin );
self.angles_x *= -1;
}
self.vUse = trigger_camera_use;
}
/*
=================
multi_manager

View File

@ -17,6 +17,7 @@ Defs.h
../Shared/WeaponFiveSeven.c
../Shared/WeaponG3SG1.c
../Shared/WeaponGlock18.c
../Shared/WeaponKnife.c
../Shared/WeaponM3.c
../Shared/WeaponM4A1.c
../Shared/WeaponMac10.c

View File

@ -23,7 +23,7 @@ weaponinfo_t wptDEFAULT = { 0, 0, 0, 0, 240, 0, 0, 0, 0, 0.0, 0.0, 0, 0.0, 0.0,
weaponinfo_t wptTable[ CS_WEAPON_COUNT ] = {
wptDEFAULT,
wptDEFAULT,
wptKNIFE,
wptUSP45,
wptGLOCK18,
wptDEAGLE,

View File

@ -0,0 +1,92 @@
/*
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.
*/
.int iClip_GLOCK18;
#ifdef SSQC
.int iMode_GLOCK18;
#else
int iWeaponMode_GLOCK18;
#endif
// Weapon Info
weaponinfo_t wptKNIFE = {
WEAPON_KNIFE, // Identifier
SLOT_MELEE,
0, // Price
0, // Caliber ID
1.0, // Max Player Speed
1, // Bullets Per Shot
1, // Clip/MagSize
15, // Damage Per Bullet
1, // Penetration Multiplier
64, // Bullet Range
0.75, // Range Modifier
TYPE_SEMI,
0.15, // Attack-Delay
1.0, // Reload-Delay
iAmmo_9MM, // Caliber Pointer
iClip_GLOCK18, // Clip Pointer
1, // Accuracy Divisor
1.0, // Accuracy Offset
1.0 // Max Inaccuracyy
};
// Anim Table
enum {
ANIM_KNIFE_IDLE1,
ANIM_KNIFE_SLASH1,
ANIM_KNIFE_SLASH2,
ANIM_KNIFE_DRAW,
ANIM_KNIFE_STAB,
ANIM_KNIFE_STAB_MISS,
ANIM_KNIFE_MIDSLASH1,
ANIM_KNIFE_MIDSLASH2
};
void WeaponKNIFE_Draw( void ) {
#ifdef SSQC
Client_SendEvent( self, EV_WEAPON_DRAW );
#else
View_PlayAnimation( ANIM_KNIFE_DRAW );
#endif
}
void WeaponKNIFE_PrimaryFire( void ) {
#ifdef SSQC
Client_SendEvent( self, EV_WEAPON_PRIMARYATTACK );
self.fAttackFinished = time + wptKNIFE.fAttackFinished;
#else
if ( random() <= 0.5 ) {
View_PlayAnimation( ANIM_KNIFE_SLASH1 );
} else {
View_PlayAnimation( ANIM_KNIFE_SLASH2 );
}
#endif
}
void WeaponKNIFE_Secondary( void ) {
#ifdef SSQC
Client_SendEvent( self, EV_WEAPON_SECONDARYATTACK );
self.fAttackFinished = time + wptKNIFE.fAttackFinished;
#else
View_PlayAnimation( ANIM_KNIFE_STAB );
#endif
}

View File

@ -22,7 +22,7 @@ void Temp_Nothing( void ) { }
weaponfunc_t wpnFuncTable[ CS_WEAPON_COUNT ] = {
{ Temp_Nothing, Temp_Nothing, Temp_Nothing, Temp_Nothing },
{ Temp_Nothing, Temp_Nothing, Temp_Nothing, Temp_Nothing },
{ WeaponKNIFE_Draw, WeaponKNIFE_PrimaryFire, WeaponKNIFE_Secondary, Temp_Nothing },
{ WeaponUSP45_Draw, WeaponUSP45_PrimaryFire, WeaponUSP45_Secondary, WeaponUSP45_Reload },
{ WeaponGLOCK18_Draw, WeaponGLOCK18_PrimaryFire, WeaponGLOCK18_Secondary, WeaponGLOCK18_Reload },
{ WeaponDEAGLE_Draw, WeaponDEAGLE_PrimaryFire, Temp_Nothing, WeaponDEAGLE_Reload },