2014-08-04 10:11:56 +00:00
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Fun Module
//
2004-02-21 19:45:58 +00:00
2005-09-14 02:38:19 +00:00
# include <string.h>
2004-02-11 15:43:26 +00:00
# include "fun.h"
2015-10-06 22:26:14 +00:00
# include <HLTypeConversion.h>
2004-02-11 15:43:26 +00:00
/*
JGHG says :
Ok this is what I use below , it may probably not be right with all natives etc but I try to maintain this style to natives .
Note that this is still very much subject to change , regarding return values etc !
( Ok I haven ' t checked all natives that they comply with this yet , this is just a model I ' m working on and which I might implement soon . )
static cell AMX_NATIVE_CALL nativename ( AMX * amx , cell * params ) / / nativename ( argument1 , argument2 ) ; = 2 params
{
// Description what this native does. <--- Description what this native does
// params[1] = argument1 <--- Description of each argument, so we don't have to allocate new variables and can
// params[2] = argument2 <--- use the ones in params[n] directly, to save some time.
// Check receiver and sender validity. <--- Check ents, maybe need to do this better and more proper later?
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] )
CHECK_PLAYER ( params [ 2 ] )
2004-02-16 10:44:52 +00:00
// Get * pointer.
2004-10-03 20:19:47 +00:00
edict_t * pPlayer = MF_GetPlayerEdict ( params [ 1 ] ) ; < - - - Players require a different function than INDEXENT because of an HLSDK bug
2004-02-11 15:43:26 +00:00
return 1 < - - - If native succeeded , return 1 , if the native isn ' t supposed to return a specific value .
Note : Should be able to do : if ( thenative ( ) ) and it should return false when it fails , and true when succeeds . . . is - 1 treated as false , or is 0 a must ?
}
*/
2015-10-06 22:26:14 +00:00
char g_bodyhits [ 33 ] [ 33 ] ; // where can the guy in the first dimension hit the people in the 2nd dimension? :-)
bool g_silent [ 33 ] ; // used for set_user_footsteps()
HLTypeConversion TypeConversion ;
2004-03-10 21:58:47 +00:00
// ######## Utils:
void FUNUTIL_ResetPlayer ( int index )
{
2005-08-07 13:38:34 +00:00
//MF_PrintSrvConsole("Resetting player index %d! maxclients: %d\n", index, gpGlobals->maxClients);
2005-03-11 09:21:03 +00:00
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + ) {
2006-04-06 14:33:15 +00:00
g_bodyhits [ index ] [ i ] = ( char ) ( ( 1 < < HITGROUP_GENERIC ) |
2004-08-31 06:32:38 +00:00
( 1 < < HITGROUP_HEAD ) |
( 1 < < HITGROUP_CHEST ) |
( 1 < < HITGROUP_STOMACH ) |
( 1 < < HITGROUP_LEFTARM ) |
( 1 < < HITGROUP_RIGHTARM ) |
( 1 < < HITGROUP_LEFTLEG ) |
2006-04-06 14:33:15 +00:00
( 1 < < HITGROUP_RIGHTLEG ) ) ;
2005-03-11 09:21:03 +00:00
}
2004-03-10 21:58:47 +00:00
// Reset silent slippers
g_silent [ index ] = false ;
}
// ######## Natives:
2004-02-11 15:43:26 +00:00
static cell AMX_NATIVE_CALL get_client_listening ( AMX * amx , cell * params ) / / get_client_listening ( receiver , sender ) ; = 2 params
{
// Gets who can listen to who.
// params[1] = receiver
// params[2] = sender
// Check receiver and sender validity.
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
CHECK_PLAYER ( params [ 2 ] ) ;
2004-02-11 15:43:26 +00:00
// GET- AND SETCLIENTLISTENING returns "qboolean", an int, probably 0 or 1...
return GETCLIENTLISTENING ( params [ 1 ] , params [ 2 ] ) ;
}
static cell AMX_NATIVE_CALL set_client_listening ( AMX * amx , cell * params ) / / set_client_listening ( receiver , sender , listen ) ; = 3 params
{
// Sets who can listen to who.
// params[1] = receiver
// params[2] = sender
// params[3] = listen
// Check receiver and sender validity.
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
CHECK_PLAYER ( params [ 2 ] ) ;
2004-02-11 15:43:26 +00:00
// Make a check on params[3] here later, and call run time error when it's wrong.
// To do: find out the possible values to set (0, 1?)
// GET- AND SETCLIENTLISTENING returns "qboolean", an int, probably 0 or 1...
return SETCLIENTLISTENING ( params [ 1 ] , params [ 2 ] , params [ 3 ] ) ;
}
static cell AMX_NATIVE_CALL set_user_godmode ( AMX * amx , cell * params ) / / set_user_godmode ( index , godmode = 0 ) ; = 2 params
{
/* Sets player godmode. If you want to disable godmode set only first parameter. */
// params[1] = index
// params[2] = godmode = 0
// Check index.
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Get player pointer.
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
if ( params [ 2 ] = = 1 ) {
// Enable godmode
pPlayer - > v . takedamage = 0.0 ; // 0.0, the player doesn't seem to be able to get hurt.
}
else {
// Disable godmode
pPlayer - > v . takedamage = 2.0 ; // 2.0 seems to be standard value?
}
return 1 ;
}
static cell AMX_NATIVE_CALL get_user_godmode ( AMX * amx , cell * params ) / / get_user_godmode ( index ) ; = 1 param
{
/* Returns 1 if godmode is set. */
// params[1] = index
// Check index.
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Get player pointer.
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
int godmode = 0 ;
if ( pPlayer - > v . takedamage = = 0.0 ) {
// God mode is enabled
godmode = 1 ;
}
return godmode ;
}
static cell AMX_NATIVE_CALL give_item ( AMX * amx , cell * params ) / / native give_item ( index , const item [ ] ) ; = 2 params
{
/* Gives item to player, name of item can start
* with weapon_ , ammo_ and item_ . This event
* is announced with proper message to all players . */
// params[1] = index
// params[2] = item...
// Check index.
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Get player pointer.
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-16 10:44:52 +00:00
2004-02-11 15:43:26 +00:00
// Create item entity pointer
edict_t * pItemEntity ;
// Make an "intstring" out of 2nd parameter
int length ;
2004-05-03 14:10:52 +00:00
const char * szItem = MF_GetAmxString ( amx , params [ 2 ] , 1 , & length ) ;
2004-02-11 15:43:26 +00:00
2004-03-23 01:18:22 +00:00
//check for valid item
if ( strncmp ( szItem , " weapon_ " , 7 ) & &
strncmp ( szItem , " ammo_ " , 5 ) & &
2004-06-16 19:02:00 +00:00
strncmp ( szItem , " item_ " , 5 ) & &
strncmp ( szItem , " tf_weapon_ " , 10 )
) {
2004-03-23 01:18:22 +00:00
return 0 ;
}
2004-02-17 15:38:55 +00:00
//string_t item = MAKE_STRING(szItem);
string_t item = ALLOC_STRING ( szItem ) ; // Using MAKE_STRING makes "item" contents get lost when we leave this scope! ALLOC_STRING seems to allocate properly...
2004-02-11 15:43:26 +00:00
// Create the entity, returns to pointer
pItemEntity = CREATE_NAMED_ENTITY ( item ) ;
2004-10-03 20:19:47 +00:00
if ( FNullEnt ( pItemEntity ) ) {
MF_LogError ( amx , AMX_ERR_NATIVE , " Item \" %s \" failed to create " , szItem ) ;
2004-09-15 15:17:52 +00:00
return 0 ;
}
2004-03-23 01:18:22 +00:00
//VARS(pItemEntity)->origin = VARS(pPlayer)->origin; // nice to do VARS(ent)->origin instead of ent->v.origin? :-I
//I'm not sure, normally I use macros too =P
pItemEntity - > v . origin = pPlayer - > v . origin ;
2004-04-27 10:08:46 +00:00
pItemEntity - > v . spawnflags | = SF_NORESPAWN ; //SF_NORESPAWN;
2004-02-11 15:43:26 +00:00
MDLL_Spawn ( pItemEntity ) ;
2004-03-23 01:18:22 +00:00
int save = pItemEntity - > v . solid ;
2004-02-17 15:38:55 +00:00
MDLL_Touch ( pItemEntity , ENT ( pPlayer ) ) ;
2004-03-23 01:18:22 +00:00
//The problem with the original give_item was the
// item was not removed. I had tried this but it
// did not work. OLO's implementation is better.
/*
2004-03-21 08:59:18 +00:00
int iEnt = ENTINDEX ( pItemEntity - > v . owner ) ;
if ( iEnt > 32 | | iEnt < 1 ) {
MDLL_Think ( pItemEntity ) ;
2004-03-23 01:18:22 +00:00
} */
if ( pItemEntity - > v . solid = = save ) {
REMOVE_ENTITY ( pItemEntity ) ;
//the function did not fail - we're just deleting the item
return - 1 ;
2004-03-21 08:59:18 +00:00
}
2004-02-11 15:43:26 +00:00
2004-03-23 01:18:22 +00:00
return ENTINDEX ( pItemEntity ) ;
2004-02-11 15:43:26 +00:00
}
static cell AMX_NATIVE_CALL spawn ( AMX * amx , cell * params ) // spawn(id) = 1 param
{
// Spawns an entity, this can be a user/player -> spawns at spawnpoints, or created entities seems to need this as a final "kick" into the game? :-)
// params[1] = entity to spawn
2015-10-06 22:26:14 +00:00
CHECK_ENTITY ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
2015-10-06 22:26:14 +00:00
edict_t * pEnt = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-16 10:44:52 +00:00
2004-02-11 15:43:26 +00:00
MDLL_Spawn ( pEnt ) ;
return 1 ;
}
static cell AMX_NATIVE_CALL set_user_health ( AMX * amx , cell * params ) / / set_user_health ( index , health ) ; = 2 arguments
{
// Sets user health. If health is 0 and below, also kill...
// params[1] = index
// params[2] = health
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Kill if health too low.
if ( params [ 2 ] > 0 )
pPlayer - > v . health = float ( params [ 2 ] ) ;
else
MDLL_ClientKill ( pPlayer ) ;
return 1 ;
}
static cell AMX_NATIVE_CALL set_user_frags ( AMX * amx , cell * params ) / / set_user_frags ( index , frags ) ; = 2 arguments
{
// Sets user frags.
// params[1] = index
// params[2] = frags
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
pPlayer - > v . frags = params [ 2 ] ;
return 1 ;
}
static cell AMX_NATIVE_CALL set_user_armor ( AMX * amx , cell * params ) / / set_user_armor ( index , armor ) ; = 2 arguments
{
// Sets user armor.
// params[1] = index
// params[2] = armor
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
pPlayer - > v . armorvalue = params [ 2 ] ;
return 1 ;
}
static cell AMX_NATIVE_CALL set_user_origin ( AMX * amx , cell * params ) / / set_user_origin ( index , origin [ 3 ] ) ; = 2 arguments
{
// Sets user origin.
// params[1] = index
// params[2] = origin
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
2004-05-03 14:10:52 +00:00
cell * newVectorCell = MF_GetAmxAddr ( amx , params [ 2 ] ) ;
2004-02-11 15:43:26 +00:00
SET_SIZE ( pPlayer , pPlayer - > v . mins , pPlayer - > v . maxs ) ;
2004-02-19 11:24:58 +00:00
SET_ORIGIN ( pPlayer , Vector ( ( float ) newVectorCell [ 0 ] , ( float ) newVectorCell [ 1 ] , ( float ) newVectorCell [ 2 ] ) ) ;
2004-02-11 15:43:26 +00:00
return 1 ;
}
static cell AMX_NATIVE_CALL set_user_rendering ( AMX * amx , cell * params ) / / set_user_rendering ( index , fx = kRenderFxNone , r = 255 , g = 255 , b = 255 , render = kRenderNormal , amount = 16 ) ; = 7 arguments
{
// Sets user rendering.
// params[1] = index
// params[2] = fx
// params[3] = r
// params[4] = g
// params[5] = b
// params[6] = render
// params[7] = amount
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
pPlayer - > v . renderfx = params [ 2 ] ;
Vector newVector = Vector ( float ( params [ 3 ] ) , float ( params [ 4 ] ) , float ( params [ 5 ] ) ) ;
pPlayer - > v . rendercolor = newVector ;
pPlayer - > v . rendermode = params [ 6 ] ;
pPlayer - > v . renderamt = params [ 7 ] ;
return 1 ;
}
static cell AMX_NATIVE_CALL set_user_maxspeed ( AMX * amx , cell * params ) // set_user_maxspeed(index, Float:speed = -1.0) = 2 arguments
{
// Sets user maxspeed.
// params[1] = index
// params[2] = speed (should be -1.0 if not specified) (JGHG: unspecified parameters seems to always be -1.0!)
2004-05-26 06:28:59 +00:00
REAL fNewSpeed = amx_ctof ( params [ 2 ] ) ;
2004-03-21 08:59:18 +00:00
2004-02-11 15:43:26 +00:00
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
2004-03-21 08:59:18 +00:00
SETCLIENTMAXSPEED ( pPlayer , fNewSpeed ) ;
pPlayer - > v . maxspeed = fNewSpeed ;
2004-02-11 15:43:26 +00:00
return 1 ;
}
static cell AMX_NATIVE_CALL get_user_maxspeed ( AMX * amx , cell * params ) // Float:get_user_maxspeed(index) = 1 argument
{
// Gets user maxspeed.
// params[1] = index
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
2004-05-26 06:28:59 +00:00
return amx_ftoc ( pPlayer - > v . maxspeed ) ;
2004-02-11 15:43:26 +00:00
}
static cell AMX_NATIVE_CALL set_user_gravity ( AMX * amx , cell * params ) // set_user_gravity(index, Float:gravity = 1.0) = 2 arguments
{
// Sets user gravity.
// params[1] = index
// params[2] = gravity (=-1.0)
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
2004-05-26 06:28:59 +00:00
pPlayer - > v . gravity = amx_ctof ( params [ 2 ] ) ;
2004-02-11 15:43:26 +00:00
return 1 ;
}
static cell AMX_NATIVE_CALL get_user_gravity ( AMX * amx , cell * params ) // Float:get_user_gravity(index) = 1 argument
{
// Gets user gravity.
// params[1] = index
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-11 15:43:26 +00:00
2004-05-26 06:28:59 +00:00
return amx_ftoc ( pPlayer - > v . gravity ) ;
2004-02-11 15:43:26 +00:00
}
2004-04-27 10:08:46 +00:00
static cell AMX_NATIVE_CALL set_user_hitzones ( AMX * amx , cell * params ) / / set_user_hitzones ( index = 0 , target = 0 , body = 255 ) ; = 3 arguments
{
2004-08-31 06:32:38 +00:00
// Sets user hitzones.
// params[1] = the one(s) who shoot(s), shooter
int shooter = params [ 1 ] ;
2004-11-02 16:51:42 +00:00
2004-08-31 06:32:38 +00:00
// params[2] = the one getting hit
int gettingHit = params [ 2 ] ;
2004-11-02 16:51:42 +00:00
2004-08-31 06:32:38 +00:00
// params[3] = specified hit zones
int hitzones = params [ 3 ] ;
//set_user_hitzones(id, 0, 0) // Makes ID not able to shoot EVERYONE - id can shoot on 0 (all) at 0
//set_user_hitzones(0, id, 0) // Makes EVERYONE not able to shoot ID - 0 (all) can shoot id at 0
if ( shooter = = 0 & & gettingHit = = 0 ) {
2005-03-11 09:21:03 +00:00
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + ) {
for ( int j = 1 ; j < = gpGlobals - > maxClients ; j + + ) {
g_bodyhits [ i ] [ j ] = hitzones ;
}
//g_zones_toHit[i] = hitzones;
//g_zones_getHit[i] = hitzones;
2004-04-27 10:08:46 +00:00
}
}
2005-03-11 09:21:03 +00:00
else if ( shooter = = 0 & & gettingHit ! = 0 ) {
// "All" shooters, target (gettingHit) should be existing player id
CHECK_PLAYER ( gettingHit ) ;
// Where can all hit gettingHit?
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + )
g_bodyhits [ i ] [ gettingHit ] = hitzones ;
}
else if ( shooter ! = 0 & & gettingHit = = 0 ) {
// Shooter can hit all in bodyparts.
CHECK_PLAYER ( shooter ) ;
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + )
g_bodyhits [ shooter ] [ i ] = hitzones ;
}
2004-04-27 10:08:46 +00:00
else {
2005-03-11 09:21:03 +00:00
// Specified, where can player A hit player B?
CHECK_PLAYER ( shooter ) ;
CHECK_PLAYER ( gettingHit ) ;
g_bodyhits [ shooter ] [ gettingHit ] = hitzones ;
2004-04-27 10:08:46 +00:00
}
2004-08-31 06:32:38 +00:00
2004-04-27 10:08:46 +00:00
return 1 ;
}
static cell AMX_NATIVE_CALL get_user_hitzones ( AMX * amx , cell * params ) / / get_user_hitzones ( index , target ) ; = 2 arguments
{
2004-08-31 06:32:38 +00:00
int shooter = params [ 1 ] ;
2005-03-11 09:21:03 +00:00
CHECK_PLAYER ( shooter ) ;
int target = params [ 2 ] ;
CHECK_PLAYER ( target ) ;
return g_bodyhits [ shooter ] [ target ] ;
2004-04-27 10:08:46 +00:00
}
2004-02-11 15:43:26 +00:00
2004-02-16 13:48:00 +00:00
static cell AMX_NATIVE_CALL set_user_noclip ( AMX * amx , cell * params ) / / set_user_noclip ( index , noclip = 0 ) ; = 2 arguments
{
// Sets user to no clipping mode.
// params[1] = index
// params[2] = no clip or not...
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-16 13:48:00 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-16 13:48:00 +00:00
if ( params [ 2 ] = = 1 )
pPlayer - > v . movetype = MOVETYPE_NOCLIP ;
else
pPlayer - > v . movetype = MOVETYPE_WALK ;
return 1 ;
}
static cell AMX_NATIVE_CALL get_user_noclip ( AMX * amx , cell * params ) / / get_user_noclip ( index ) ; = 1 argument
{
// Gets user noclip.
// params[1] = index
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-16 13:48:00 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-02-16 13:48:00 +00:00
return pPlayer - > v . movetype = = MOVETYPE_NOCLIP ;
}
2004-02-18 11:10:54 +00:00
// JustinHoMi made this one originally
static cell AMX_NATIVE_CALL set_user_footsteps ( AMX * amx , cell * params ) / / set_user_footsteps ( id , set = 1 ) ; = 2 params
{
// Gives player silent footsteps.
// if set=0 it will return footsteps to normal
// params[1] = index of player
// params[2] = 0 = normal footstep sound, 1 = silent slippers
// Check index
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-02-18 11:10:54 +00:00
// Fetch player pointer
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
if ( params [ 2 ] ) {
2004-02-18 11:10:54 +00:00
pPlayer - > v . flTimeStepSound = 999 ;
2004-03-10 21:58:47 +00:00
g_silent [ params [ 1 ] ] = true ;
2004-02-18 11:10:54 +00:00
}
else {
pPlayer - > v . flTimeStepSound = STANDARDTIMESTEPSOUND ;
2004-03-10 21:58:47 +00:00
g_silent [ params [ 1 ] ] = false ;
2004-02-18 11:10:54 +00:00
}
return 1 ;
}
2004-02-16 13:48:00 +00:00
2006-02-01 13:04:24 +00:00
static cell AMX_NATIVE_CALL get_user_footsteps ( AMX * amx , cell * params )
{
CHECK_PLAYER ( params [ 1 ] ) ;
return g_silent [ params [ 1 ] ] ;
}
2004-06-21 09:16:14 +00:00
// SidLuke
2006-02-02 00:45:56 +00:00
static cell AMX_NATIVE_CALL strip_user_weapons ( AMX * amx , cell * params ) // index
{
2004-10-03 20:19:47 +00:00
CHECK_PLAYER ( params [ 1 ] ) ;
2004-06-21 09:16:14 +00:00
2015-10-06 22:26:14 +00:00
edict_t * pPlayer = TypeConversion . id_to_edict ( params [ 1 ] ) ;
2004-06-21 09:16:14 +00:00
2005-11-19 00:34:25 +00:00
string_t item = MAKE_STRING ( " player_weaponstrip " ) ;
edict_t * pent = CREATE_NAMED_ENTITY ( item ) ;
2015-10-06 22:26:14 +00:00
if ( FNullEnt ( pent ) )
2005-11-19 00:34:25 +00:00
{
2004-06-21 09:16:14 +00:00
return 0 ;
}
MDLL_Spawn ( pent ) ;
2006-02-02 00:45:56 +00:00
MDLL_Use ( pent , pPlayer ) ;
2004-06-21 09:16:14 +00:00
REMOVE_ENTITY ( pent ) ;
2006-02-02 00:45:56 +00:00
* reinterpret_cast < int * > ( MF_PlayerPropAddr ( params [ 1 ] , Player_CurrentWeapon ) ) = 0 ;
2005-11-12 00:47:34 +00:00
return 1 ;
2004-06-21 09:16:14 +00:00
}
2004-02-11 15:43:26 +00:00
AMX_NATIVE_INFO fun_Exports [ ] = {
{ " get_client_listen " , get_client_listening } ,
{ " set_client_listen " , set_client_listening } ,
{ " set_user_godmode " , set_user_godmode } ,
{ " get_user_godmode " , get_user_godmode } ,
{ " set_user_health " , set_user_health } ,
{ " give_item " , give_item } ,
{ " spawn " , spawn } ,
{ " set_user_frags " , set_user_frags } ,
{ " set_user_armor " , set_user_armor } ,
{ " set_user_origin " , set_user_origin } ,
{ " set_user_rendering " , set_user_rendering } ,
{ " set_user_maxspeed " , set_user_maxspeed } ,
{ " get_user_maxspeed " , get_user_maxspeed } ,
{ " set_user_gravity " , set_user_gravity } ,
{ " get_user_gravity " , get_user_gravity } ,
2006-02-01 13:04:24 +00:00
{ " get_user_footsteps " , get_user_footsteps } ,
2004-03-10 21:58:47 +00:00
{ " set_user_hitzones " , set_user_hitzones } ,
2004-03-10 22:32:10 +00:00
{ " get_user_hitzones " , get_user_hitzones } ,
2004-02-16 13:48:00 +00:00
{ " set_user_noclip " , set_user_noclip } ,
{ " get_user_noclip " , get_user_noclip } ,
2004-02-18 11:10:54 +00:00
{ " set_user_footsteps " , set_user_footsteps } ,
2004-06-21 09:16:14 +00:00
{ " strip_user_weapons " , strip_user_weapons } ,
2004-02-11 15:43:26 +00:00
/////////////////// <--- 19 chars max in current small version
{ NULL , NULL }
} ;
/******************************************************************************************/
2004-02-27 13:59:00 +00:00
void PlayerPreThink ( edict_t * pEntity )
2004-02-18 11:10:54 +00:00
{
2004-03-10 21:58:47 +00:00
if ( g_silent [ ENTINDEX ( pEntity ) ] ) {
2004-02-18 11:10:54 +00:00
pEntity - > v . flTimeStepSound = 999 ;
RETURN_META ( MRES_HANDLED ) ;
}
RETURN_META ( MRES_IGNORED ) ;
}
2004-08-31 02:29:31 +00:00
int ClientConnect ( edict_t * pPlayer , const char * pszName , const char * pszAddress , char szRejectReason [ 128 ] )
2004-03-10 21:58:47 +00:00
{
// Reset stuff:
2004-04-27 10:08:46 +00:00
FUNUTIL_ResetPlayer ( ENTINDEX ( pPlayer ) ) ;
2004-03-10 21:58:47 +00:00
2004-05-03 08:55:48 +00:00
RETURN_META_VALUE ( MRES_IGNORED , 0 ) ;
2004-03-10 21:58:47 +00:00
}
2005-03-11 09:21:03 +00:00
void TraceLine ( const float * v1 , const float * v2 , int fNoMonsters , edict_t * shooter , TraceResult * ptr ) {
TRACE_LINE ( v1 , v2 , fNoMonsters , shooter , ptr ) ;
if ( ptr - > pHit & & ( ptr - > pHit - > v . flags & ( FL_CLIENT | FL_FAKECLIENT ) )
& & shooter & & ( shooter - > v . flags & ( FL_CLIENT | FL_FAKECLIENT ) ) ) {
int shooterIndex = ENTINDEX ( shooter ) ;
if ( ! ( g_bodyhits [ shooterIndex ] [ ENTINDEX ( ptr - > pHit ) ] & ( 1 < < ptr - > iHitgroup ) ) )
ptr - > flFraction = 1.0 ;
2004-04-27 10:08:46 +00:00
}
RETURN_META ( MRES_SUPERCEDE ) ;
2004-02-11 15:43:26 +00:00
}
2005-03-11 09:21:03 +00:00
//int g_hitIndex, g_canTargetGetHit, g_canShooterHitThere;
//void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr) {
// if (!pentToSkip || (pentToSkip->v.flags & (FL_CLIENT | FL_FAKECLIENT)) == false || pentToSkip->v.deadflag != DEAD_NO)
// RETURN_META(MRES_IGNORED);
//
// TRACE_LINE(v1, v2, fNoMonsters, shooter, ptr); // Filter shooter
//
// if (!ptr->pHit || (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)) == false )
// RETURN_META(MRES_SUPERCEDE);
//
// g_hitIndex = ENTINDEX(ptr->pHit);
// //bool blocked = false;
// g_canTargetGetHit = g_zones_getHit[g_hitIndex] & (1 << ptr->iHitgroup);
// g_canShooterHitThere = g_zones_toHit[ENTINDEX(shooter)] & (1 << ptr->iHitgroup);
//
// if (!g_canTargetGetHit || !g_canShooterHitThere) {
// ptr->flFraction = 1.0; // set to not hit anything (1.0 = shot doesn't hit anything)
// //blocked = true;
// }
// /*
// if (blocked) {
// MF_PrintSrvConsole("%s was blocked from hitting %s: %d and %d\n", MF_GetPlayerName(ENTINDEX(pentToSkip)), MF_GetPlayerName(hitIndex), canTargetGetHit, canShooterHitThere);
// }
// else {
// MF_PrintSrvConsole("%s was NOT blocked from hitting %s: %d and %d\n", MF_GetPlayerName(ENTINDEX(pentToSkip)), MF_GetPlayerName(hitIndex), canTargetGetHit, canShooterHitThere);
// }
// */
//
// RETURN_META(MRES_SUPERCEDE);
//}
2004-08-31 02:29:31 +00:00
void OnAmxxAttach ( )
2004-05-03 14:10:52 +00:00
{
MF_AddNatives ( fun_Exports ) ;
2005-08-07 13:38:34 +00:00
}
2004-07-13 21:26:38 +00:00
2005-08-07 13:38:34 +00:00
// The content of OnPluginsLoaded() was moved from OnAmxxAttach with AMXx 1.5 because for some reason gpGlobals->maxClients wasn't
// initialized to its proper value until some time after OnAmxxAttach(). In OnAmxxAttach() it always showed 0. /JGHG
void OnPluginsLoaded ( ) {
2004-07-13 21:26:38 +00:00
// Reset stuff - hopefully this should
2005-03-11 09:21:03 +00:00
for ( int i = 1 ; i < = gpGlobals - > maxClients ; i + + ) {
2004-07-13 21:26:38 +00:00
// Reset all hitzones
2004-08-31 06:32:38 +00:00
FUNUTIL_ResetPlayer ( i ) ;
2004-07-13 21:26:38 +00:00
}
2015-10-06 22:26:14 +00:00
TypeConversion . init ( ) ;
2004-07-13 21:26:38 +00:00
}
/*
void ClientConnectFakeBot ( int index )
{
FUNUTIL_ResetPlayer ( index ) ;
//MF_Log("A bot connects, forwarded to fun! The bot is %d!", index);
//CPlayer* player;
2004-02-25 20:55:38 +00:00
}
2004-08-22 12:41:00 +00:00
*/