Senior Member
07-18-2018
, 16:45
Paintball gun and walkguard bug
#1
Hi guys i have an issue with paintball mod and walkguard i have set some blocked zones with walkguard (players can't walk through those zones) but the issue is when you shoot with your paintball gun , paintball balls can't go through this walkguard block entity , it acts like i was shooting on a wall and this is a big issue does someone know how to fix this bug here is a photo and codes of both plugins
Photo
Codes
Walkguard
Spoiler
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>
#define PLUGIN "WalkGuard"
#define VERSION "1.3.2"
#define AUTHOR "mogel"
/*
* fakemeta-version by djmd378
*/
enum ZONEMODE {
ZM_NOTHING ,
ZM_CAMPING ,
ZM_CAMPING_T1 , // Team 1 -> e.g. Terrorist
ZM_CAMPING_T2 , // Team 2 -> e.g. Counter-Terroris
ZM_BLOCK_ALL ,
ZM_KILL ,
ZM_KILL_T1 , // DoD-Unterstützung
ZM_KILL_T2
}
new zonemode [ ZONEMODE ][] = { "ZONE_MODE_NONE" , "ZONE_MODE_CAMPER" , "ZONE_MODE_CAMPER_T1" , "ZONE_MODE_CAMPER_T2" , "ZONE_MODE_BLOCKING" , "ZONE_MODE_CHEATER" , "ZONE_MODE_CHEATER_T1" , "ZONE_MODE_CHEATER_T2" }
new zonename [ ZONEMODE ][] = { "wgz_none" , "wgz_camper" , "wgz_camper_t1" , "wgz_camper_t2" , "wgz_block_all" , "wgz_kill" , "wgz_kill_t1" , "wgz_kill_t2" }
new solidtyp [ ZONEMODE ] = { SOLID_NOT , SOLID_TRIGGER , SOLID_TRIGGER , SOLID_TRIGGER , SOLID_BBOX , SOLID_TRIGGER , SOLID_TRIGGER , SOLID_TRIGGER }
new zonecolor [ ZONEMODE ][ 3 ] = {
{ 255 , 0 , 255 }, // nichts
{ 0 , 255 , 0 }, // Camperzone
{ 0 , 255 , 128 }, // Camperzone T1
{ 128 , 255 , 0 }, // Camperzone T2
{ 255 , 255 , 255 }, // alle Blockieren
{ 255 , 0 , 0 }, // Kill
{ 255 , 0 , 128 }, // Kill - T1
{ 255 , 128 , 0 } // Kill - T2
}
#define ZONEID pev_iuser1
#define CAMPERTIME pev_iuser2
new zone_color_aktiv [ 3 ] = { 0 , 0 , 255 }
new zone_color_red [ 3 ] = { 255 , 0 , 0 }
new zone_color_green [ 3 ] = { 255 , 255 , 0 }
// alle Zonen
#define MAXZONES 100
new zone [ MAXZONES ]
new maxzones // soviele existieren
new index // die aktuelle Zone
// Editier-Funktionen
new setupunits = 10 // Änderungen an der Größe um diese Einheiten
new direction = 0 // 0 -> X-Koorinaten / 1 -> Y-Koords / 2 -> Z-Koords
new koordinaten [ 3 ][] = { "TRANSLATE_X_KOORD" , "TRANSLATE_Y_KOORD" , "TRANSLATE_Z_KOORD" }
new spr_dot // benötigt für die Lininen
new editor = 0 // dieser Spieler ist gerade am erstellen .. Menü verkraftet nur einen Editor
new camperzone [ 33 ] // letzte Meldung der CamperZone
new Float : campertime [ 33 ] // der erste Zeitpunkt des eintreffens in die Zone
new Float : camping [ 33 ] // der letzte Zeitpunkt des campens
#define TASK_BASIS_CAMPER 2000
#define TASK_BASIS_SHOWZONES 1000
new pcv_damage
new pcv_botdamage
new pcv_immunity
new pcv_direction
new pcv_botdirection
new pcv_damageicon
// less CPU
new slap_direction
new slap_botdirection
new slap_damage
new slap_botdamage
new admin_immunity
new icon_damage // Damage-Icon
enum ROUNDSTATUS {
RS_UNDEFINED ,
RS_RUNNING ,
RS_FREEZETIME ,
RS_END ,
}
new ROUNDSTATUS : roundstatus = RS_UNDEFINED
public plugin_init () {
register_plugin ( PLUGIN , VERSION , AUTHOR )
register_cvar ( "WalkGuard" , VERSION , FCVAR_SERVER | FCVAR_SPONLY | FCVAR_UNLOGGED )
server_cmd ( "WalkGuard %s" , VERSION )
pcv_damage = register_cvar ( "wg_damage" , "10" )
pcv_botdamage = register_cvar ( "wg_botdamage" , "0" ) // Bot's sind einfach nur dumm ... und können nicht lesen
pcv_immunity = register_cvar ( "wg_immunity" , "0" ) // Admins mit Immunität brauchen nicht
pcv_direction = register_cvar ( "wg_direction" , "1" ) // zufällige Richtung beim Slap
pcv_botdirection = register_cvar ( "wg_botdirection" , "1" ) // dito für Bots
pcv_damageicon = register_cvar ( "wg_damageicon" , "262144" ) // eigentlich ein Pfeil
register_menu ( "MainMenu" , - 1 , "MainMenuAction" , 0 )
register_menu ( "EditMenu" , - 1 , "EditMenuAction" , 0 )
register_menu ( "KillMenu" , - 1 , "KillMenuAction" , 0 )
// Menu
register_clcmd ( "walkguardmenu" , "InitWalkGuard" , ADMIN_RCON , " - open the WalkGuard-Menu" )
// Sprache
register_dictionary ( "walkguard.txt" )
// Einstelleungen der Variablen laden
register_event ( "HLTV" , "Event_FreezeTime" , "a" , "1=0" , "2=0" )
register_logevent ( "Event_RoundStart" , 2 , "1=Round_Start" )
register_logevent ( "Event_RoundEnd" , 2 , "1=Round_End" )
register_forward ( FM_Touch , "fw_touch" )
// Zonen nachladen
set_task ( 1.0 , "LoadWGZ" )
}
public plugin_precache () {
precache_model ( "models/gib_skull.mdl" )
spr_dot = precache_model ( "sprites/dot.spr" )
}
public client_disconnect ( player ) {
// aus irgend welchen Gründen ist der Spieler einfach wech........
if ( player == editor ) HideAllZones ()
}
public Event_FreezeTime () {
roundstatus = RS_FREEZETIME
}
public Event_RoundStart () {
roundstatus = RS_RUNNING
// CPU schonen und die Variablen am Anfang gleich merken
slap_damage = get_pcvar_num ( pcv_damage )
slap_direction = get_pcvar_num ( pcv_direction )
slap_botdamage = get_pcvar_num ( pcv_botdamage )
slap_botdirection = get_pcvar_num ( pcv_botdirection )
admin_immunity = get_pcvar_num ( pcv_immunity )
icon_damage = get_pcvar_num ( pcv_damageicon )
}
public Event_RoundEnd () {
roundstatus = RS_END
}
// -----------------------------------------------------------------------------------------
//
// WalkGuard-Action
//
// -> hier ist alles was passiert
//
// -----------------------------------------------------------------------------------------
public fw_touch ( zone , player ) {
if ( editor ) return FMRES_IGNORED
if (! pev_valid ( zone ) || ! is_user_connected ( player ))
return FMRES_IGNORED
static classname [ 33 ]
pev ( player , pev_classname , classname , 32 )
if (! equal ( classname , "player" ))
return FMRES_IGNORED
pev ( zone , pev_classname , classname , 32 )
if (! equal ( classname , "walkguardzone" ))
return FMRES_IGNORED
if ( roundstatus == RS_RUNNING )
ZoneTouch ( player , zone )
return FMRES_IGNORED
}
public ZoneTouch ( player , zone ) {
new zm = pev ( zone , ZONEID )
new userteam = get_user_team ( player )
// Admin mit Immunity brauchen nicht
if ( admin_immunity && ( get_user_flags ( player ) & ADMIN_IMMUNITY )) return
// Kill Bill
if ( ( ZONEMODE : zm == ZM_KILL ) || (( ZONEMODE : zm == ZM_KILL_T1 ) && ( userteam == 1 )) || (( ZONEMODE : zm == ZM_KILL_T2 ) && ( userteam == 2 )) )
set_task ( 0.1 , "ZoneModeKill" , player )
// Camping
if ( ( ZONEMODE : zm == ZM_CAMPING ) || (( ZONEMODE : zm == ZM_CAMPING_T1 ) && ( userteam == 1 )) || (( ZONEMODE : zm == ZM_CAMPING_T2 ) && ( userteam == 2 )) ) {
if (! camping [ player ]) {
client_print ( player , print_center , "%L" , player , "WALKGUARD_CAMPING_INIT" )
// Gratulation ... Du wirst beobachtet
camperzone [ player ] = zone
campertime [ player ] = get_gametime ()
camping [ player ] = get_gametime ()
set_task ( 0.5 , "ZoneModeCamper" , TASK_BASIS_CAMPER + player , _ , _ , "b" )
} else {
// immer fleissig mitzählen
camping [ player ] = get_gametime ()
}
}
}
public ZoneModeKill ( player ) {
if (! is_user_connected ( player ) || ! is_user_alive ( player )) return
user_silentkill ( player )
for(new i = 0 ; i < 5 ; i ++) client_print ( player , print_chat , "[WalkGuard] %L" , player , "WALKGUARD_KILL_MESSAGE" )
client_cmd ( player , "speak ambience/thunder_clap.wav" )
}
public ZoneModeCamper ( player ) {
player -= TASK_BASIS_CAMPER
if (! is_user_connected ( player ))
{
// so ein Feigling ... hat sich einfach verdrückt ^^
remove_task ( TASK_BASIS_CAMPER + player )
return
}
new Float : gametime = get_gametime ();
if (( gametime - camping [ player ]) > 0.5 )
{
// *juhu* ... wieder frei
campertime [ player ] = 0.0
camping [ player ] = 0.0
remove_task ( TASK_BASIS_CAMPER + player )
return
}
new ct = pev ( camperzone [ player ], CAMPERTIME )
new left = ct - floatround ( gametime - campertime [ player ])
if ( left < 1 )
{
client_print ( player , print_center , "%L" , player , "WALKGUARD_CAMPING_DAMG" )
if ( is_user_bot ( player ))
{
if ( slap_botdirection ) RandomDirection ( player )
fm_fakedamage ( player , "camping" , float ( slap_botdamage ), 0 )
} else
{
if ( slap_direction ) RandomDirection ( player )
fm_fakedamage ( player , "camping" , float ( slap_damage ), icon_damage )
}
} else
{
client_print ( player , print_center , "%L" , player , "WALKGUARD_CAMPING_TIME" , left )
}
}
public RandomDirection ( player ) {
new Float : velocity [ 3 ]
velocity [ 0 ] = random_float (- 256.0 , 256.0 )
velocity [ 1 ] = random_float (- 256.0 , 256.0 )
velocity [ 2 ] = random_float (- 256.0 , 256.0 )
set_pev ( player , pev_velocity , velocity )
}
// -----------------------------------------------------------------------------------------
//
// Zonenerstellung
//
// -----------------------------------------------------------------------------------------
public CreateZone ( Float : position [ 3 ], Float : mins [ 3 ], Float : maxs [ 3 ], zm , campertime ) {
new entity = fm_create_entity ( "info_target" )
set_pev ( entity , pev_classname , "walkguardzone" )
fm_entity_set_model ( entity , "models/gib_skull.mdl" )
fm_entity_set_origin ( entity , position )
set_pev ( entity , pev_movetype , MOVETYPE_FLY )
new id = pev ( entity , ZONEID )
if ( editor )
{
set_pev ( entity , pev_solid , SOLID_NOT )
} else
{
set_pev ( entity , pev_solid , solidtyp [ ZONEMODE : id ])
}
fm_entity_set_size ( entity , mins , maxs )
fm_set_entity_visibility ( entity , 0 )
set_pev ( entity , ZONEID , zm )
set_pev ( entity , CAMPERTIME , campertime )
//log_amx("create zone '%s' with campertime %i seconds", zonename[ZONEMODE:zm], campertime)
return entity
}
public CreateNewZone ( Float : position [ 3 ]) {
new Float : mins [ 3 ] = { - 32.0 , - 32.0 , - 32.0 }
new Float : maxs [ 3 ] = { 32.0 , 32.0 , 32.0 }
return CreateZone ( position , mins , maxs , 0 , 10 ); // ZM_NONE
}
public CreateZoneOnPlayer ( player ) {
// Position und erzeugen
new Float : position [ 3 ]
pev ( player , pev_origin , position )
new entity = CreateNewZone ( position )
FindAllZones ()
for(new i = 0 ; i < maxzones ; i ++) if ( zone [ i ] == entity ) index = i ;
}
// -----------------------------------------------------------------------------------------
//
// Load & Save der WGZ
//
// -----------------------------------------------------------------------------------------
public SaveWGZ ( player ) {
new zonefile [ 200 ]
new mapname [ 50 ]
// Verzeichnis holen
get_configsdir ( zonefile , 199 )
format ( zonefile , 199 , "%s/walkguard" , zonefile )
if (! dir_exists ( zonefile )) mkdir ( zonefile )
// Namen über Map erstellen
get_mapname ( mapname , 49 )
format ( zonefile , 199 , "%s/%s.wgz" , zonefile , mapname )
delete_file ( zonefile ) // pauschal
FindAllZones () // zur Sicherheit
// Header
write_file ( zonefile , "; V1 - WalkGuard Zone-File" )
write_file ( zonefile , "; <zonename> <position (x/y/z)> <mins (x/y/z)> <maxs (x/y/z)> [<parameter>] " )
write_file ( zonefile , ";" )
write_file ( zonefile , ";" )
write_file ( zonefile , "; parameter" )
write_file ( zonefile , ";" )
write_file ( zonefile , "; - wgz_camper <time>" )
write_file ( zonefile , "; - wgz_camper_t1 <time>" )
write_file ( zonefile , "; - wgz_camper_t2 <time>" )
write_file ( zonefile , "; - wgz_camper_t3 <time>" )
write_file ( zonefile , "; - wgz_camper_t4 <time>" )
write_file ( zonefile , ";" )
write_file ( zonefile , "" )
// alle Zonen speichern
for(new i = 0 ; i < maxzones ; i ++)
{
new z = zone [ i ] // das Entity
// diverse Daten der Zone
new zm = pev ( z , ZONEID )
// Koordinaten holen
new Float : pos [ 3 ]
pev ( z , pev_origin , pos )
// Dimensionen holen
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( z , pev_mins , mins )
pev ( z , pev_maxs , maxs )
// Ausgabe formatieren
// -> Type und CamperTime
new output [ 1000 ]
format ( output , 999 , "%s" , zonename [ ZONEMODE : zm ])
// -> Position
format ( output , 999 , "%s %.1f %.1f %.1f" , output , pos [ 0 ], pos [ 1 ], pos [ 2 ])
// -> Dimensionen
format ( output , 999 , "%s %.0f %.0f %.0f" , output , mins [ 0 ], mins [ 1 ], mins [ 2 ])
format ( output , 999 , "%s %.0f %.0f %.0f" , output , maxs [ 0 ], maxs [ 1 ], maxs [ 2 ])
// diverse Parameter
if (( ZONEMODE : zm == ZM_CAMPING ) || ( ZONEMODE : zm == ZM_CAMPING_T1 ) || ( ZONEMODE : zm == ZM_CAMPING_T2 ))
{
new ct = pev ( z , CAMPERTIME )
format ( output , 999 , "%s %i" , output , ct )
}
// und schreiben
write_file ( zonefile , output )
}
client_print ( player , print_chat , "%L" , player , "ZONE_FILE_SAVED" , zonefile )
}
public LoadWGZ () {
new zonefile [ 200 ]
new mapname [ 50 ]
// Verzeichnis holen
get_configsdir ( zonefile , 199 )
format ( zonefile , 199 , "%s/walkguard" , zonefile )
// Namen über Map erstellen
get_mapname ( mapname , 49 )
format ( zonefile , 199 , "%s/%s.wgz" , zonefile , mapname )
if (! file_exists ( zonefile ))
{
log_amx ( "no zone-file found" )
return
}
// einlesen der Daten
new input [ 1000 ], line = 0 , len
while( ( line = read_file ( zonefile , line , input , 127 , len ) ) != 0 )
{
if (! strlen ( input ) || ( input [ 0 ] == ';' )) continue; // Kommentar oder Leerzeile
new data [ 20 ], zm = 0 , ct // "abgebrochenen" Daten - ZoneMode - CamperTime
new Float : mins [ 3 ], Float : maxs [ 3 ], Float : pos [ 3 ] // Größe & Position
// Zone abrufen
strbreak ( input , data , 20 , input , 999 )
zm = - 1
for(new i = 0 ; ZONEMODE : i < ZONEMODE ; ZONEMODE : i ++)
{
// Änderungen von CS:CZ zu allen Mods
if ( equal ( data , "wgz_camper_te" )) format ( data , 19 , "wgz_camper_t1" )
if ( equal ( data , "wgz_camper_ct" )) format ( data , 19 , "wgz_camper_t2" )
if ( equal ( data , zonename [ ZONEMODE : i ])) zm = i ;
}
if ( zm == - 1 )
{
log_amx ( "undefined zone -> '%s' ... dropped" , data )
continue;
}
// Position holen
strbreak ( input , data , 20 , input , 999 ); pos [ 0 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); pos [ 1 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); pos [ 2 ] = str_to_float ( data );
// Dimensionen
strbreak ( input , data , 20 , input , 999 ); mins [ 0 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); mins [ 1 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); mins [ 2 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); maxs [ 0 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); maxs [ 1 ] = str_to_float ( data );
strbreak ( input , data , 20 , input , 999 ); maxs [ 2 ] = str_to_float ( data );
if (( ZONEMODE : zm == ZM_CAMPING ) || ( ZONEMODE : zm == ZM_CAMPING_T1 ) || ( ZONEMODE : zm == ZM_CAMPING_T2 ))
{
// Campertime wird immer mitgeliefert
strbreak ( input , data , 20 , input , 999 )
ct = str_to_num ( data )
}
// und nun noch erstellen
CreateZone ( pos , mins , maxs , zm , ct );
}
FindAllZones ()
HideAllZones ()
}
// -----------------------------------------------------------------------------------------
//
// WalkGuard-Menu
//
// -----------------------------------------------------------------------------------------
public FX_Box ( Float : sizemin [ 3 ], Float : sizemax [ 3 ], color [ 3 ], life ) {
// FX
message_begin ( MSG_ALL , SVC_TEMPENTITY );
write_byte ( 31 );
write_coord ( floatround ( sizemin [ 0 ] ) ); // x
write_coord ( floatround ( sizemin [ 1 ] ) ); // y
write_coord ( floatround ( sizemin [ 2 ] ) ); // z
write_coord ( floatround ( sizemax [ 0 ] ) ); // x
write_coord ( floatround ( sizemax [ 1 ] ) ); // y
write_coord ( floatround ( sizemax [ 2 ] ) ); // z
write_short ( life ) // Life
write_byte ( color [ 0 ]) // Color R / G / B
write_byte ( color [ 1 ])
write_byte ( color [ 2 ])
message_end ();
}
public FX_Line ( start [ 3 ], stop [ 3 ], color [ 3 ], brightness ) {
message_begin ( MSG_ONE_UNRELIABLE , SVC_TEMPENTITY , _ , editor )
write_byte ( TE_BEAMPOINTS )
write_coord ( start [ 0 ])
write_coord ( start [ 1 ])
write_coord ( start [ 2 ])
write_coord ( stop [ 0 ])
write_coord ( stop [ 1 ])
write_coord ( stop [ 2 ])
write_short ( spr_dot )
write_byte ( 1 ) // framestart
write_byte ( 1 ) // framerate
write_byte ( 4 ) // life in 0.1's
write_byte ( 5 ) // width
write_byte ( 0 ) // noise
write_byte ( color [ 0 ] ) // r, g, b
write_byte ( color [ 1 ] ) // r, g, b
write_byte ( color [ 2 ] ) // r, g, b
write_byte ( brightness ) // brightness
write_byte ( 0 ) // speed
message_end ()
}
public DrawLine ( Float : x1 , Float : y1 , Float : z1 , Float : x2 , Float : y2 , Float : z2 , color [ 3 ]) {
new start [ 3 ]
new stop [ 3 ]
start [ 0 ] = floatround ( x1 )
start [ 1 ] = floatround ( y1 )
start [ 2 ] = floatround ( z1 )
stop [ 0 ] = floatround ( x2 )
stop [ 1 ] = floatround ( y2 )
stop [ 2 ] = floatround ( z2 )
FX_Line ( start , stop , color , 200 )
}
public ShowAllZones () {
FindAllZones () // zur Sicherheit alle suchen
for(new i = 0 ; i < maxzones ; i ++)
{
new z = zone [ i ]
remove_task ( TASK_BASIS_SHOWZONES + z )
set_pev ( z , pev_solid , SOLID_NOT )
set_task ( 0.2 , "ShowZoneBox" , TASK_BASIS_SHOWZONES + z , _ , _ , "b" )
}
}
public ShowZoneBox ( entity ) {
entity -= TASK_BASIS_SHOWZONES
if ((! fm_is_valid_ent ( entity )) || ! editor ) return
// Koordinaten holen
new Float : pos [ 3 ]
pev ( entity , pev_origin , pos )
if (! fm_is_in_viewcone ( editor , pos ) && ( entity != zone [ index ])) return // sieht der Editor eh nicht
// jetzt vom Editor zur Zone testen... Zonen hinter der Wand aber im ViewCone
// müssen nicht gezeichnet werden
new Float : editorpos [ 3 ]
pev ( editor , pev_origin , editorpos )
new Float : hitpoint [ 3 ] // da ist der Treffer
fm_trace_line (- 1 , editorpos , pos , hitpoint )
// Linie zur Zone zeichnen ... dann wird sie schneller gefunden
if ( entity == zone [ index ]) DrawLine ( editorpos [ 0 ], editorpos [ 1 ], editorpos [ 2 ] - 16.0 , pos [ 0 ], pos [ 1 ], pos [ 2 ], { 255 , 0 , 0 } )
// Distanz zum Treffer ... ist Wert größer dann war da etwas
new Float : dh = vector_distance ( editorpos , pos ) - vector_distance ( editorpos , hitpoint )
if ( ( floatabs ( dh ) > 128.0 ) && ( entity != zone [ index ])) return // hinter einer Wand
// -+*+- die Zone muss gezeichnet werden -+*+-
// Dimensionen holen
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( entity , pev_mins , mins )
pev ( entity , pev_maxs , maxs )
// Größe in Absolut umrechnen
mins [ 0 ] += pos [ 0 ]
mins [ 1 ] += pos [ 1 ]
mins [ 2 ] += pos [ 2 ]
maxs [ 0 ] += pos [ 0 ]
maxs [ 1 ] += pos [ 1 ]
maxs [ 2 ] += pos [ 2 ]
new id = pev ( entity , ZONEID )
new color [ 3 ]
color [ 0 ] = ( zone [ index ] == entity ) ? zone_color_aktiv [ 0 ] : zonecolor [ ZONEMODE : id ][ 0 ]
color [ 1 ] = ( zone [ index ] == entity ) ? zone_color_aktiv [ 1 ] : zonecolor [ ZONEMODE : id ][ 1 ]
color [ 2 ] = ( zone [ index ] == entity ) ? zone_color_aktiv [ 2 ] : zonecolor [ ZONEMODE : id ][ 2 ]
// einzelnen Linien der Box zeichnen
// -> alle Linien beginnen bei maxs
DrawLine ( maxs [ 0 ], maxs [ 1 ], maxs [ 2 ], mins [ 0 ], maxs [ 1 ], maxs [ 2 ], color )
DrawLine ( maxs [ 0 ], maxs [ 1 ], maxs [ 2 ], maxs [ 0 ], mins [ 1 ], maxs [ 2 ], color )
DrawLine ( maxs [ 0 ], maxs [ 1 ], maxs [ 2 ], maxs [ 0 ], maxs [ 1 ], mins [ 2 ], color )
// -> alle Linien beginnen bei mins
DrawLine ( mins [ 0 ], mins [ 1 ], mins [ 2 ], maxs [ 0 ], mins [ 1 ], mins [ 2 ], color )
DrawLine ( mins [ 0 ], mins [ 1 ], mins [ 2 ], mins [ 0 ], maxs [ 1 ], mins [ 2 ], color )
DrawLine ( mins [ 0 ], mins [ 1 ], mins [ 2 ], mins [ 0 ], mins [ 1 ], maxs [ 2 ], color )
// -> die restlichen 6 Lininen
DrawLine ( mins [ 0 ], maxs [ 1 ], maxs [ 2 ], mins [ 0 ], maxs [ 1 ], mins [ 2 ], color )
DrawLine ( mins [ 0 ], maxs [ 1 ], mins [ 2 ], maxs [ 0 ], maxs [ 1 ], mins [ 2 ], color )
DrawLine ( maxs [ 0 ], maxs [ 1 ], mins [ 2 ], maxs [ 0 ], mins [ 1 ], mins [ 2 ], color )
DrawLine ( maxs [ 0 ], mins [ 1 ], mins [ 2 ], maxs [ 0 ], mins [ 1 ], maxs [ 2 ], color )
DrawLine ( maxs [ 0 ], mins [ 1 ], maxs [ 2 ], mins [ 0 ], mins [ 1 ], maxs [ 2 ], color )
DrawLine ( mins [ 0 ], mins [ 1 ], maxs [ 2 ], mins [ 0 ], maxs [ 1 ], maxs [ 2 ], color )
// der Rest wird nur gezeichnet wenn es sich um ide aktuelle Box handelt
if ( entity != zone [ index ]) return
// jetzt noch die Koordinaten-Linien
if ( direction == 0 ) // X-Koordinaten
{
DrawLine ( maxs [ 0 ], maxs [ 1 ], maxs [ 2 ], maxs [ 0 ], mins [ 1 ], mins [ 2 ], zone_color_green )
DrawLine ( maxs [ 0 ], maxs [ 1 ], mins [ 2 ], maxs [ 0 ], mins [ 1 ], maxs [ 2 ], zone_color_green )
DrawLine ( mins [ 0 ], maxs [ 1 ], maxs [ 2 ], mins [ 0 ], mins [ 1 ], mins [ 2 ], zone_color_red )
DrawLine ( mins [ 0 ], maxs [ 1 ], mins [ 2 ], mins [ 0 ], mins [ 1 ], maxs [ 2 ], zone_color_red )
}
if ( direction == 1 ) // Y-Koordinaten
{
DrawLine ( mins [ 0 ], mins [ 1 ], mins [ 2 ], maxs [ 0 ], mins [ 1 ], maxs [ 2 ], zone_color_red )
DrawLine ( maxs [ 0 ], mins [ 1 ], mins [ 2 ], mins [ 0 ], mins [ 1 ], maxs [ 2 ], zone_color_red )
DrawLine ( mins [ 0 ], maxs [ 1 ], mins [ 2 ], maxs [ 0 ], maxs [ 1 ], maxs [ 2 ], zone_color_green )
DrawLine ( maxs [ 0 ], maxs [ 1 ], mins [ 2 ], mins [ 0 ], maxs [ 1 ], maxs [ 2 ], zone_color_green )
}
if ( direction == 2 ) // Z-Koordinaten
{
DrawLine ( maxs [ 0 ], maxs [ 1 ], maxs [ 2 ], mins [ 0 ], mins [ 1 ], maxs [ 2 ], zone_color_green )
DrawLine ( maxs [ 0 ], mins [ 1 ], maxs [ 2 ], mins [ 0 ], maxs [ 1 ], maxs [ 2 ], zone_color_green )
DrawLine ( maxs [ 0 ], maxs [ 1 ], mins [ 2 ], mins [ 0 ], mins [ 1 ], mins [ 2 ], zone_color_red )
DrawLine ( maxs [ 0 ], mins [ 1 ], mins [ 2 ], mins [ 0 ], maxs [ 1 ], mins [ 2 ], zone_color_red )
}
}
public HideAllZones () {
editor = 0 // Menü für den nächsten wieder frei geben ... ufnktionalität aktivieren
for(new i = 0 ; i < maxzones ; i ++)
{
new id = pev ( zone [ i ], ZONEID )
set_pev ( zone [ i ], pev_solid , solidtyp [ ZONEMODE : id ])
remove_task ( TASK_BASIS_SHOWZONES + zone [ i ])
}
}
public FindAllZones () {
new entity = - 1
maxzones = 0
while( ( entity = fm_find_ent_by_class ( entity , "walkguardzone" )) )
{
zone [ maxzones ] = entity
maxzones ++
}
}
public InitWalkGuard ( player ) {
new name [ 33 ], steam [ 33 ]
get_user_name ( player , name , 32 )
get_user_authid ( player , steam , 32 )
if (!( get_user_flags ( player ) & ADMIN_RCON ))
{
log_amx ( "no access-rights for '%s' <%s>" , name , steam )
return PLUGIN_HANDLED
}
editor = player
FindAllZones ();
ShowAllZones ();
set_task ( 0.1 , "OpenWalkGuardMenu" , player )
return PLUGIN_HANDLED
}
public OpenWalkGuardMenu ( player ) {
new trans [ 70 ]
new menu [ 1024 ]
new zm = - 1
new ct
new menukeys = MENU_KEY_0 + MENU_KEY_4 + MENU_KEY_9
if ( fm_is_valid_ent ( zone [ index ]))
{
zm = pev ( zone [ index ], ZONEID )
ct = pev ( zone [ index ], CAMPERTIME )
}
format ( menu , 1023 , "\dWalkGuard-Menu - Version %s\w" , VERSION )
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%L" , player , "WGM_ZONE_FOUND" , menu , maxzones )
if ( zm != - 1 )
{
format ( trans , 69 , "%L" , player , zonemode [ ZONEMODE : zm ])
if ( ZONEMODE : zm == ZM_CAMPING )
{
format ( menu , 1023 , "%L" , player , "WGM_ZONE_CURRENT_CAMP" , menu , index + 1 , trans , ct )
} else
{
format ( menu , 1023 , "%L" , player , "WGM_ZONE_CURRENT_NONE" , menu , index + 1 , trans )
}
menukeys += MENU_KEY_2 + MENU_KEY_3 + MENU_KEY_1
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%L" , player , "WGM_ZONE_EDIT" , menu )
format ( menu , 1023 , "%L" , player , "WGM_ZONE_CHANGE" , menu )
}
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%L" , player , "WGM_ZONE_CREATE" , menu )
if ( zm != - 1 )
{
menukeys += MENU_KEY_6
format ( menu , 1023 , "%L" , player , "WGM_ZONE_DELETE" , menu )
}
format ( menu , 1023 , "%L" , player , "WGM_ZONE_SAVE" , menu )
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%L" , player , "WGM_ZONE_EXIT" , menu )
show_menu ( player , menukeys , menu , - 1 , "MainMenu" )
client_cmd ( player , "spk sound/buttons/blip1.wav" )
}
public MainMenuAction ( player , key ) {
key = ( key == 10 ) ? 0 : key + 1
switch( key )
{
case 1 : {
// Zone editieren
if ( fm_is_valid_ent ( zone [ index ])) OpenEditMenu ( player ); else OpenWalkGuardMenu ( player );
}
case 2 : {
// vorherige Zone
index = ( index > 0 ) ? index - 1 : index ;
OpenWalkGuardMenu ( player )
}
case 3 : {
// nächste Zone
index = ( index < maxzones - 1 ) ? index + 1 : index ;
OpenWalkGuardMenu ( player )
}
case 4 : {
// neue Zone über dem Spieler
if ( maxzones < MAXZONES - 1 )
{
CreateZoneOnPlayer ( player );
ShowAllZones ();
MainMenuAction ( player , 0 ); // selber aufrufen
} else
{
client_print ( player , print_chat , "%L" , player , "ZONE_FULL" )
client_cmd ( player , "spk sound/buttons/button10.wav" )
set_task ( 0.5 , "OpenWalkGuardMenu" , player )
}
}
case 6 : {
// aktuelle Zone löschen
OpenKillMenu ( player );
}
case 9 : {
// Zonen speichern
SaveWGZ ( player )
OpenWalkGuardMenu ( player )
}
case 10 :{
editor = 0
HideAllZones ()
}
}
}
public OpenEditMenu ( player ) {
new trans [ 70 ]
new menu [ 1024 ]
new menukeys = MENU_KEY_0 + MENU_KEY_1 + MENU_KEY_4 + MENU_KEY_5 + MENU_KEY_6 + MENU_KEY_7 + MENU_KEY_8 + MENU_KEY_9
format ( menu , 1023 , "\dEdit WalkGuard-Zone\w" )
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
new zm = - 1
new ct
if ( fm_is_valid_ent ( zone [ index ]))
{
zm = pev ( zone [ index ], ZONEID )
ct = pev ( zone [ index ], CAMPERTIME )
}
if ( zm != - 1 )
{
format ( trans , 69 , "%L" , player , zonemode [ ZONEMODE : zm ])
if (( ZONEMODE : zm == ZM_CAMPING ) || ( ZONEMODE : zm == ZM_CAMPING_T1 ) || ( ZONEMODE : zm == ZM_CAMPING_T2 ))
{
format ( menu , 1023 , "%L" , player , "WGE_ZONE_CURRENT_CAMP" , menu , trans , ct )
format ( menu , 1023 , "%L" , player , "WGE_ZONE_CURRENT_CHANGE" , menu )
menukeys += MENU_KEY_2 + MENU_KEY_3
} else
{
format ( menu , 1023 , "%L" , player , "WGE_ZONE_CURRENT_NONE" , menu , trans )
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
}
}
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( trans , 49 , "%L" , player , koordinaten [ direction ])
format ( menu , 1023 , "%L" , player , "WGE_ZONE_SIZE_INIT" , menu , trans )
format ( menu , 1023 , "%L" , player , "WGE_ZONE_SIZE_MINS" , menu )
format ( menu , 1023 , "%L" , player , "WGE_ZONE_SIZE_MAXS" , menu )
format ( menu , 1023 , "%L" , player , "WGE_ZONE_SIZE_STEP" , menu , setupunits )
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%s^n" , menu ) // Leerzeile
format ( menu , 1023 , "%L" , player , "WGE_ZONE_SIZE_QUIT" , menu )
show_menu ( player , menukeys , menu , - 1 , "EditMenu" )
client_cmd ( player , "spk sound/buttons/blip1.wav" )
}
public EditMenuAction ( player , key ) {
key = ( key == 10 ) ? 0 : key + 1
switch( key )
{
case 1 : {
// nächster ZoneMode
new zm = - 1
zm = pev ( zone [ index ], ZONEID )
if ( ZONEMODE : zm == ZM_KILL_T2 ) zm = 0 ; else zm ++;
set_pev ( zone [ index ], ZONEID , zm )
OpenEditMenu ( player )
}
case 2 : {
// Campertime runter
new ct = pev ( zone [ index ], CAMPERTIME )
ct = ( ct > 5 ) ? ct - 1 : 5
set_pev ( zone [ index ], CAMPERTIME , ct )
OpenEditMenu ( player )
}
case 3 : {
// Campertime hoch
new ct = pev ( zone [ index ], CAMPERTIME )
ct = ( ct < 30 ) ? ct + 1 : 30
set_pev ( zone [ index ], CAMPERTIME , ct )
OpenEditMenu ( player )
}
case 4 : {
// Editier-Richtung ändern
direction = ( direction < 2 ) ? direction + 1 : 0
OpenEditMenu ( player )
}
case 5 : {
// von "mins" / rot etwas abziehen -> schmaler
ZuRotAddieren ()
OpenEditMenu ( player )
}
case 6 : {
// zu "mins" / rot etwas addieren -> breiter
VonRotAbziehen ()
OpenEditMenu ( player )
}
case 7 : {
// von "maxs" / gelb etwas abziehen -> schmaler
VonGelbAbziehen ()
OpenEditMenu ( player )
}
case 8 : {
// zu "maxs" / gelb etwas addierne -> breiter
ZuGelbAddieren ()
OpenEditMenu ( player )
}
case 9 : {
// Schreitweite ändern
setupunits = ( setupunits < 100 ) ? setupunits * 10 : 1
OpenEditMenu ( player )
}
case 10 :{
OpenWalkGuardMenu ( player )
}
}
}
public VonRotAbziehen () {
new entity = zone [ index ]
// Koordinaten holen
new Float : pos [ 3 ]
pev ( entity , pev_origin , pos )
// Dimensionen holen
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( entity , pev_mins , mins )
pev ( entity , pev_maxs , maxs )
// könnte Probleme geben -> zu klein
//if ((floatabs(mins[direction]) + maxs[direction]) < setupunits + 1) return
mins [ direction ] -= float ( setupunits ) / 2.0
maxs [ direction ] += float ( setupunits ) / 2.0
pos [ direction ] -= float ( setupunits ) / 2.0
set_pev ( entity , pev_origin , pos )
fm_entity_set_size ( entity , mins , maxs )
}
public ZuRotAddieren () {
new entity = zone [ index ]
// Koordinaten holen
new Float : pos [ 3 ]
pev ( entity , pev_origin , pos )
// Dimensionen holen
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( entity , pev_mins , mins )
pev ( entity , pev_maxs , maxs )
// könnte Probleme geben -> zu klein
if (( floatabs ( mins [ direction ]) + maxs [ direction ]) < setupunits + 1 ) return
mins [ direction ] += float ( setupunits ) / 2.0
maxs [ direction ] -= float ( setupunits ) / 2.0
pos [ direction ] += float ( setupunits ) / 2.0
set_pev ( entity , pev_origin , pos )
fm_entity_set_size ( entity , mins , maxs )
}
public VonGelbAbziehen () {
new entity = zone [ index ]
// Koordinaten holen
new Float : pos [ 3 ]
pev ( entity , pev_origin , pos )
// Dimensionen holen
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( entity , pev_mins , mins )
pev ( entity , pev_maxs , maxs )
// könnte Probleme geben -> zu klein
if (( floatabs ( mins [ direction ]) + maxs [ direction ]) < setupunits + 1 ) return
mins [ direction ] += float ( setupunits ) / 2.0
maxs [ direction ] -= float ( setupunits ) / 2.0
pos [ direction ] -= float ( setupunits ) / 2.0
set_pev ( entity , pev_origin , pos )
fm_entity_set_size ( entity , mins , maxs )
}
public ZuGelbAddieren () {
new entity = zone [ index ]
// Koordinaten holen
new Float : pos [ 3 ]
pev ( entity , pev_origin , pos )
// Dimensionen holen
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( entity , pev_mins , mins )
pev ( entity , pev_maxs , maxs )
// könnte Probleme geben -> zu klein
//if ((floatabs(mins[direction]) + maxs[direction]) < setupunits + 1) return
mins [ direction ] -= float ( setupunits ) / 2.0
maxs [ direction ] += float ( setupunits ) / 2.0
pos [ direction ] += float ( setupunits ) / 2.0
set_pev ( entity , pev_origin , pos )
fm_entity_set_size ( entity , mins , maxs )
}
public OpenKillMenu ( player ) {
new menu [ 1024 ]
format ( menu , 1023 , "%L" , player , "ZONE_KILL_INIT" )
format ( menu , 1023 , "%L" , player , "ZONE_KILL_ASK" , menu ) // ja - nein - vieleicht
show_menu ( player , MENU_KEY_1 + MENU_KEY_0 , menu , - 1 , "KillMenu" )
client_cmd ( player , "spk sound/buttons/button10.wav" )
}
public KillMenuAction ( player , key ) {
key = ( key == 10 ) ? 0 : key + 1
switch( key )
{
case 1 : {
client_print ( player , print_chat , "[WalkGuard] %L" , player , "ZONE_KILL_NO" )
}
case 10 :{
fm_remove_entity ( zone [ index ])
index --;
if ( index < 0 ) index = 0 ;
client_print ( player , print_chat , "[WalkGuard] %L" , player , "ZONE_KILL_YES" )
FindAllZones ()
}
}
OpenWalkGuardMenu ( player )
}
stock fm_set_kvd ( entity , const key [], const value [], const classname [] = "" ) {
if ( classname [ 0 ])
set_kvd ( 0 , KV_ClassName , classname )
else {
new class[ 32 ]
pev ( entity , pev_classname , class, sizeof class - 1 )
set_kvd ( 0 , KV_ClassName , class)
}
set_kvd ( 0 , KV_KeyName , key )
set_kvd ( 0 , KV_Value , value )
set_kvd ( 0 , KV_fHandled , 0 )
return dllfunc ( DLLFunc_KeyValue , entity , 0 )
}
stock fm_fake_touch ( toucher , touched )
return dllfunc ( DLLFunc_Touch , toucher , touched )
stock fm_DispatchSpawn ( entity )
return dllfunc ( DLLFunc_Spawn , entity )
stock fm_remove_entity ( index )
return engfunc ( EngFunc_RemoveEntity , index )
stock fm_find_ent_by_class ( index , const classname [])
return engfunc ( EngFunc_FindEntityByString , index , "classname" , classname )
stock fm_is_valid_ent ( index )
return pev_valid ( index )
stock fm_entity_set_size ( index , const Float : mins [ 3 ], const Float : maxs [ 3 ])
return engfunc ( EngFunc_SetSize , index , mins , maxs )
stock fm_entity_set_model ( index , const model [])
return engfunc ( EngFunc_SetModel , index , model )
stock fm_create_entity (const classname [])
return engfunc ( EngFunc_CreateNamedEntity , engfunc ( EngFunc_AllocString , classname ))
stock fm_fakedamage ( victim , const classname [], Float : takedmgdamage , damagetype ) {
new class[] = "trigger_hurt"
new entity = fm_create_entity (class)
if (! entity )
return 0
new value [ 16 ]
float_to_str ( takedmgdamage * 2 , value , sizeof value - 1 )
fm_set_kvd ( entity , "dmg" , value , class)
num_to_str ( damagetype , value , sizeof value - 1 )
fm_set_kvd ( entity , "damagetype" , value , class)
fm_set_kvd ( entity , "origin" , "8192 8192 8192" , class)
fm_DispatchSpawn ( entity )
set_pev ( entity , pev_classname , classname )
fm_fake_touch ( entity , victim )
fm_remove_entity ( entity )
return 1
}
stock fm_entity_set_origin ( index , const Float : origin [ 3 ]) {
new Float : mins [ 3 ], Float : maxs [ 3 ]
pev ( index , pev_mins , mins )
pev ( index , pev_maxs , maxs )
engfunc ( EngFunc_SetSize , index , mins , maxs )
return engfunc ( EngFunc_SetOrigin , index , origin )
}
stock fm_set_entity_visibility ( index , visible = 1 ) {
set_pev ( index , pev_effects , visible == 1 ? pev ( index , pev_effects ) & ~ EF_NODRAW : pev ( index , pev_effects ) | EF_NODRAW )
return 1
}
stock bool : fm_is_in_viewcone ( index , const Float : point [ 3 ]) {
new Float : angles [ 3 ]
pev ( index , pev_angles , angles )
engfunc ( EngFunc_MakeVectors , angles )
global_get ( glb_v_forward , angles )
angles [ 2 ] = 0.0
new Float : origin [ 3 ], Float : diff [ 3 ], Float : norm [ 3 ]
pev ( index , pev_origin , origin )
xs_vec_sub ( point , origin , diff )
diff [ 2 ] = 0.0
xs_vec_normalize ( diff , norm )
new Float : dot , Float : fov
dot = xs_vec_dot ( norm , angles )
pev ( index , pev_fov , fov )
if ( dot >= floatcos ( fov * M_PI / 360 ))
return true
return false
}
stock fm_trace_line ( ignoreent , const Float : start [ 3 ], const Float : end [ 3 ], Float : ret [ 3 ]) {
engfunc ( EngFunc_TraceLine , start , end , ignoreent == - 1 ? 1 : 0 , ignoreent , 0 )
new ent = get_tr2 ( 0 , TR_pHit )
get_tr2 ( 0 , TR_vecEndPos , ret )
return pev_valid ( ent ) ? ent : 0
}
Paintballgun
Spoiler
PHP Code:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#define PLUGIN "Paintball Gaun"
#define VERSION "3.4"
#define AUTHOR "WhooKid"
#define MAX_PAINTBALLS 200
#define TASK_PB_RESET 1000
#define TASK_RELOAD 2000
new g_paintballs [ MAX_PAINTBALLS ], g_pbstatus [ MAX_PAINTBALLS ], g_pbcount , Float : lastshot [ 33 ], Float : nextattack [ 33 ], freezetime ;
new pbgun , pbusp , pbglock , color , shots , veloc , speed , blife , sound , bglow , damge , friendlyfire , tgun , ctgun , beamspr ;
static const g_shot_anim [ 4 ] = { 0 , 3 , 9 , 5 };
static const g_pbgun_models [ 11 ][] = { "models/v_pbgun.mdl" , "models/v_pbgun1.mdl" , "models/v_pbgun2.mdl" , "models/v_pbgun3.mdl" , "models/v_pbgun4.mdl" , "models/v_pbgun5.mdl" , "models/v_pbgun6.mdl" , "models/v_pbgun7.mdl" , "models/v_pbgun8.mdl" , "models/v_pbgun9.mdl" , "models/v_pbgun10.mdl" };
public plugin_init ()
{
register_plugin ( PLUGIN , VERSION , AUTHOR );
register_cvar ( "paintballgun" , VERSION , FCVAR_SERVER | FCVAR_UNLOGGED );
register_clcmd ( "say /ent" , "ent_info" , ADMIN_SLAY );
pbgun = register_cvar ( "amx_pbgun" , "1" );
pbusp = register_cvar ( "amx_pbusp" , "1" );
pbglock = register_cvar ( "amx_pbglock" , "1" );
if ( get_pcvar_num ( pbgun ) || get_pcvar_num ( pbusp ) || get_pcvar_num ( pbglock ))
{
register_event ( "CurWeapon" , "ev_curweapon" , "be" );
register_logevent ( "ev_roundstart" , 2 , "0=World triggered" , "1=Round_Start" );
if ( get_cvar_num ( "mp_freezetime" ) > 0 )
register_event ( "HLTV" , "ev_freezetime" , "a" , "1=0" , "2=0" );
register_forward ( FM_Touch , "fw_touch" );
register_forward ( FM_SetModel , "fw_setmodel" );
register_forward ( FM_PlayerPreThink , "fw_playerprethink" , 1 );
register_forward ( FM_UpdateClientData , "fw_updateclientdata" , 1 );
color = register_cvar ( "pbgun_color" , "2" );
shots = register_cvar ( "pbgun_shots" , "100" );
veloc = register_cvar ( "pbgun_velocity" , "2000" );
speed = register_cvar ( "pbgun_speed" , "0.08" );
blife = register_cvar ( "pbgun_life" , "15" );
sound = register_cvar ( "pbgun_sound" , "1" );
bglow = register_cvar ( "pbgun_glow" , "a" );
damge = register_cvar ( "pbgun_damage" , "100" );
friendlyfire = get_cvar_pointer ( "mp_friendlyfire" );
new a , max_ents_allow = global_get ( glb_maxEntities ) - 5 ;
for ( a = 1 ; a <= get_pcvar_num ( shots ); a ++)
if ( a < MAX_PAINTBALLS )
if ( engfunc ( EngFunc_NumberOfEntities ) < max_ents_allow )
{
g_paintballs [ a ] = engfunc ( EngFunc_CreateNamedEntity , engfunc ( EngFunc_AllocString , "info_target" ));
if ( pev_valid ( g_paintballs [ a ]))
{
set_pev ( g_paintballs [ a ], pev_effects , pev ( g_paintballs [ a ], pev_effects ) | EF_NODRAW );
g_pbcount ++;
}
}
if ( g_pbcount < 1 )
set_fail_state ( "[AMXX] Failed to load Paintball Gun (unable to create ents)" );
server_print ( "*** %s v%s by %s Enabled ***" , PLUGIN , VERSION , AUTHOR );
}
}
public plugin_precache ()
{
register_cvar ( "amx_pbgun" , "1" );
register_cvar ( "amx_pbusp" , "1" );
register_cvar ( "amx_pbglock" , "1" );
register_cvar ( "pbgun_tgun" , "3" );
register_cvar ( "pbgun_ctgun" , "7" );
tgun = get_cvar_num ( "pbgun_tgun" );
ctgun = get_cvar_num ( "pbgun_ctgun" );
if ( get_cvar_num ( "amx_pbgun" )) {
precache_model ( g_pbgun_models [ tgun ]);
precache_model ( g_pbgun_models [ ctgun ]);
precache_model (( ctgun ) ? "models/p_pbgun1.mdl" : "models/p_pbgun.mdl" );
precache_model ( "models/w_pbgun.mdl" );
}
if ( get_cvar_num ( "amx_pbusp" )) {
precache_model ( "models/v_pbusp.mdl" );
precache_model ( "models/p_pbusp.mdl" );
}
if ( get_cvar_num ( "amx_pbglock" )) {
precache_model ( "models/v_pbglock.mdl" );
precache_model ( "models/p_pbglock.mdl" );
}
if ( get_cvar_num ( "amx_pbgun" ) || get_cvar_num ( "amx_pbusp" ) || get_cvar_num ( "amx_pbglock" )) {
precache_sound ( "misc/pb1.wav" );
precache_sound ( "misc/pb2.wav" );
precache_sound ( "misc/pb3.wav" );
precache_sound ( "misc/pb4.wav" );
precache_sound ( "misc/pbg.wav" );
precache_model ( "models/w_paintball.mdl" );
precache_model ( "sprites/paintball.spr" );
}
beamspr = precache_model ( "sprites/laserbeam.spr" );
}
public ent_info ( id )
client_print ( id , print_chat , "[AMXX] [Ent Info (Current/Max)] Paintballs: (%d/%d) Entities: (%d/%d)" , g_pbcount , get_pcvar_num ( shots ), engfunc ( EngFunc_NumberOfEntities ), global_get ( glb_maxEntities ));
public ev_curweapon ( id )
{
new model [ 25 ];
pev ( id , pev_viewmodel2 , model , 24 );
if ( equali ( model , "models/v_mp5.mdl" ) && get_pcvar_num ( pbgun ))
{
set_pev ( id , pev_viewmodel2 , ( get_user_team ( id ) == 1 ) ? g_pbgun_models [ tgun ] : g_pbgun_models [ ctgun ]);
set_pev ( id , pev_weaponmodel2 , ( ctgun ) ? "models/p_pbgun1.mdl" : "models/p_pbgun.mdl" );
}
else if ( equali ( model , "models/v_usp.mdl" ) && get_pcvar_num ( pbusp ))
{
set_pev ( id , pev_viewmodel2 , "models/v_pbusp.mdl" );
set_pev ( id , pev_weaponmodel2 , "models/p_pbusp.mdl" );
}
else if ( equali ( model , "models/v_glock18.mdl" ) && get_pcvar_num ( pbglock ))
{
set_pev ( id , pev_viewmodel2 , "models/v_pbglock.mdl" );
set_pev ( id , pev_weaponmodel2 , "models/p_pbglock.mdl" );
}
}
public fw_setmodel ( ent , model [])
{
if ( equali ( model , "models/w_mp5.mdl" ))
if ( get_pcvar_num ( pbgun ))
{
engfunc ( EngFunc_SetModel , ent , "models/w_pbgun.mdl" );
return FMRES_SUPERCEDE ;
}
return FMRES_IGNORED ;
}
public fw_updateclientdata ( id , sw , cd_handle )
{
if ( user_has_pbgun ( id ) && cd_handle )
{
set_cd ( cd_handle , CD_ID , 1 );
get_cd ( cd_handle , CD_flNextAttack , nextattack [ id ]);
//set_cd(cd_handle, CD_flNextAttack, 10.0);
return FMRES_HANDLED ;
}
return FMRES_IGNORED ;
}
public fw_playerprethink ( id )
{
new my_pbgun = user_has_pbgun ( id );
if ( my_pbgun )
{
new buttons = pev ( id , pev_button );
if ( buttons & IN_ATTACK )
{
new ammo , null = get_user_weapon ( id , ammo , null );
if ( ammo )
{
set_pev ( id , pev_button , buttons & ~ IN_ATTACK );
new Float : gametime = get_gametime (), Float : g_speed ;
if ( my_pbgun == 1 )
g_speed = get_pcvar_float ( speed );
else
g_speed = ( my_pbgun == 2 ) ? get_pcvar_float ( speed ) * 2.0 : get_pcvar_float ( speed ) * 3.0 ;
if ( gametime - lastshot [ id ] > g_speed && nextattack [ id ] < 0.0 && ! freezetime )
{
if ( paint_fire ( id ))
{
lastshot [ id ] = gametime ;
set_user_clip ( id , ammo - 1 );
set_pev ( id , pev_punchangle , Float :{- 0.5 , 0.0 , 0.0 });
message_begin ( MSG_ONE_UNRELIABLE , SVC_WEAPONANIM , _ , id );
write_byte ( g_shot_anim [ my_pbgun ]);
write_byte ( 0 );
message_end ();
if ( get_pcvar_num ( sound ))
emit_sound ( id , CHAN_AUTO , "misc/pbg.wav" , 1.0 , ATTN_NORM , 0 , PITCH_NORM );
}
}
}
}
}
return FMRES_IGNORED ;
}
public paint_fire ( id )
{
new a , ent ;
while ( a ++ < g_pbcount - 1 && ! ent )
if ( g_pbstatus [ a ] == 0 )
ent = g_pbstatus [ a ] = g_paintballs [ a ];
if (! ent )
while ( a -- > 1 && ! ent )
if ( g_pbstatus [ a ] == 2 )
ent = g_pbstatus [ a ] = g_paintballs [ a ];
if ( pev_valid ( ent ) && is_user_alive ( id ))
{
new Float : vangles [ 3 ], Float : nvelocity [ 3 ], Float : voriginf [ 3 ], vorigin [ 3 ], clr ;
set_pev ( ent , pev_classname , "pbBullet" );
set_pev ( ent , pev_owner , id );
engfunc ( EngFunc_SetModel , ent , "models/w_paintball.mdl" );
engfunc ( EngFunc_SetSize , ent , Float :{- 1.0 , - 1.0 , - 1.0 }, Float :{ 1.0 , 1.0 , 1.0 });
switch ( get_pcvar_num ( color ))
{
case 2 : clr = ( get_user_team ( id ) == 1 ) ? 0 : 1 ;
case 3 : clr = ( get_user_team ( id ) == 1 ) ? 4 : 3 ;
case 4 : clr = ( get_user_team ( id ) == 1 ) ? 2 : 5 ;
default: clr = random_num ( 0 , 6 );
}
set_pev ( ent , pev_skin , clr );
get_user_origin ( id , vorigin , 1 );
IVecFVec ( vorigin , voriginf );
engfunc ( EngFunc_SetOrigin , ent , voriginf );
vangles [ 0 ] = random_float (- 180.0 , 180.0 );
vangles [ 1 ] = random_float (- 180.0 , 180.0 );
set_pev ( ent , pev_angles , vangles );
pev ( id , pev_v_angle , vangles );
set_pev ( ent , pev_v_angle , vangles );
pev ( id , pev_view_ofs , vangles );
set_pev ( ent , pev_view_ofs , vangles );
set_pev ( ent , pev_solid , 2 );
set_pev ( ent , pev_movetype , 5 );
velocity_by_aim ( id , get_pcvar_num ( veloc ), nvelocity );
set_pev ( ent , pev_velocity , nvelocity );
set_pev ( ent , pev_effects , pev ( ent , pev_effects ) & ~ EF_NODRAW );
set_task ( 0.1 , "paint_glow" , ent );
set_task ( 15.0 , "paint_reset" , ent + TASK_PB_RESET );
}
return ent ;
}
public fw_touch ( bullet , ent )
{
new class[ 20 ];
pev ( bullet , pev_classname , class, 19 );
if (! equali (class, "pbBullet" ))
return FMRES_IGNORED ;
new Float : origin [ 3 ], class2 [ 20 ], owner = pev ( bullet , pev_owner ), is_ent_alive = is_user_alive ( ent );
pev ( ent , pev_classname , class2 , 19 );
pev ( bullet , pev_origin , origin );
if ( is_ent_alive )
{
if ( owner == ent || pev ( ent , pev_takedamage ) == DAMAGE_NO )
return FMRES_IGNORED ;
if ( get_user_team ( owner ) == get_user_team ( ent ))
if (! get_pcvar_num ( friendlyfire ))
return FMRES_IGNORED ;
ExecuteHam ( Ham_TakeDamage , ent , owner , owner , float ( get_pcvar_num ( damge )), 4098 );
}
if (! equali (class, class2 ))
{
set_pev ( bullet , pev_velocity , Float :{ 0.0 , 0.0 , 0.0 });
set_pev ( bullet , pev_classname , "pbPaint" );
set_pev ( bullet , pev_solid , 0 );
set_pev ( bullet , pev_movetype , 0 );
engfunc ( EngFunc_SetModel , bullet , "sprites/paintball.spr" );
new a , findpb = 0 ;
while ( a ++ < g_pbcount && ! findpb )
if ( g_paintballs [ a ] == bullet )
findpb = g_pbstatus [ a ] = 2 ;
remove_task ( bullet );
remove_task ( bullet + TASK_PB_RESET );
if ( get_pcvar_num ( sound ))
{
static wav [ 20 ];
formatex ( wav , 20 , is_ent_alive ? "player/pl_pain%d.wav" : "misc/pb%d.wav" , is_ent_alive ? random_num ( 4 , 7 ) : random_num ( 1 , 4 ));
emit_sound ( bullet , CHAN_AUTO , wav , 1.0 , ATTN_NORM , 0 , PITCH_NORM );
}
new bool : valid_surface = ( is_ent_alive || containi ( class2 , "door" ) != - 1 ) ? false : true ;
if ( pev ( ent , pev_health ) && ! is_ent_alive )
{
ExecuteHam ( Ham_TakeDamage , ent , owner , owner , float ( pev ( ent , pev_health )), 0 );
valid_surface = false ;
}
if ( valid_surface )
{
paint_splat ( bullet );
set_task ( float ( get_pcvar_num ( blife )), "paint_reset" , bullet + TASK_PB_RESET );
}
else
paint_reset ( bullet + TASK_PB_RESET );
return FMRES_HANDLED ;
}
return FMRES_IGNORED ;
}
public paint_splat ( ent )
{
new Float : origin [ 3 ], Float : norigin [ 3 ], Float : viewofs [ 3 ], Float : angles [ 3 ], Float : normal [ 3 ], Float : aiming [ 3 ];
pev ( ent , pev_origin , origin );
pev ( ent , pev_view_ofs , viewofs );
pev ( ent , pev_v_angle , angles );
norigin [ 0 ] = origin [ 0 ] + viewofs [ 0 ];
norigin [ 1 ] = origin [ 1 ] + viewofs [ 1 ];
norigin [ 2 ] = origin [ 2 ] + viewofs [ 2 ];
aiming [ 0 ] = norigin [ 0 ] + floatcos ( angles [ 1 ], degrees ) * 1000.0 ;
aiming [ 1 ] = norigin [ 1 ] + floatsin ( angles [ 1 ], degrees ) * 1000.0 ;
aiming [ 2 ] = norigin [ 2 ] + floatsin (- angles [ 0 ], degrees ) * 1000.0 ;
engfunc ( EngFunc_TraceLine , norigin , aiming , 0 , ent , 0 );
get_tr2 ( 0 , TR_vecPlaneNormal , normal );
vector_to_angle ( normal , angles );
angles [ 1 ] += 180.0 ;
if ( angles [ 1 ] >= 360.0 ) angles [ 1 ] -= 360.0 ;
set_pev ( ent , pev_angles , angles );
set_pev ( ent , pev_v_angle , angles );
origin [ 0 ] += ( normal [ 0 ] * random_float ( 0.3 , 2.7 ));
origin [ 1 ] += ( normal [ 1 ] * random_float ( 0.3 , 2.7 ));
origin [ 2 ] += ( normal [ 2 ] * random_float ( 0.3 , 2.7 ));
engfunc ( EngFunc_SetOrigin , ent , origin );
set_pev ( ent , pev_frame , float ( random_num ( ( pev ( ent , pev_skin ) * 18 ), ( pev ( ent , pev_skin ) * 18 ) + 17 ) ));
if ( pev ( ent , pev_renderfx ) != kRenderFxNone )
set_rendering ( ent );
}
public paint_glow ( ent )
{
if ( pev_valid ( ent ))
{
static pbglow [ 5 ], clr [ 3 ];
get_pcvar_string ( bglow , pbglow , 4 );
switch ( get_pcvar_num ( color ))
{
case 2 : clr = ( get_user_team ( pev ( ent , pev_owner ))== 1 ) ? { 255 , 0 , 0 } : { 0 , 0 , 255 };
default: clr = { 255 , 255 , 255 };
}
if ( read_flags ( pbglow ) & ( 1 << 0 ))
set_rendering ( ent , kRenderFxGlowShell , clr [ 0 ], clr [ 1 ], clr [ 2 ], kRenderNormal , 255 );
if ( read_flags ( pbglow ) & ( 1 << 1 ))
{
message_begin ( MSG_BROADCAST , SVC_TEMPENTITY );
write_byte ( TE_BEAMFOLLOW );
write_short ( ent );
write_short ( beamspr );
write_byte ( 4 );
write_byte ( 2 );
write_byte ( clr [ 0 ]);
write_byte ( clr [ 1 ]);
write_byte ( clr [ 2 ]);
write_byte ( 255 );
message_end ();
}
}
}
public paint_reset ( ent )
{
remove_task ( ent );
ent -= TASK_PB_RESET ;
new a , findpb = 1 ;
while ( a ++ <= g_pbcount && findpb )
if ( g_paintballs [ a ] == ent )
findpb = g_pbstatus [ a ] = 0 ;
set_pev ( ent , pev_effects , pev ( ent , pev_effects ) | EF_NODRAW );
engfunc ( EngFunc_SetSize , ent , Float :{ 0.0 , 0.0 , 0.0 }, Float :{ 0.0 , 0.0 , 0.0 });
set_pev ( ent , pev_velocity , Float :{ 0.0 , 0.0 , 0.0 });
engfunc ( EngFunc_SetOrigin , ent , Float :{- 2000.0 , - 2000.0 , - 2000.0 });
if ( pev ( ent , pev_renderfx ) != kRenderFxNone )
set_rendering ( ent );
}
public ev_roundstart ()
{
for (new a = 1 ; a <= g_pbcount ; a ++)
if ( g_pbstatus [ a ] != 0 )
paint_reset ( g_paintballs [ a ]+ TASK_PB_RESET );
if ( freezetime )
freezetime = 0 ;
}
public ev_freezetime ()
freezetime = 1 ;
stock user_has_pbgun ( id )
{
if ( is_user_alive ( id ))
{
new model [ 25 ];
pev ( id , pev_viewmodel2 , model , 24 );
if ( containi ( model , "models/v_pbgun" ) != - 1 )
return 1 ;
else if ( equali ( model , "models/v_pbusp.mdl" ))
return 2 ;
else if ( equali ( model , "models/v_pbglock.mdl" ))
return 3 ;
}
return 0 ;
}
stock set_user_clip ( id , ammo )
{
new weaponname [ 32 ], weaponid = - 1 , weapon = get_user_weapon ( id , _ , _ );
get_weaponname ( weapon , weaponname , 31 );
while (( weaponid = engfunc ( EngFunc_FindEntityByString , weaponid , "classname" , weaponname )) != 0 )
if ( pev ( weaponid , pev_owner ) == id ) {
set_pdata_int ( weaponid , 51 , ammo , 4 );
return weaponid ;
}
return 0 ;
}
// teame06's function
stock set_rendering ( index , fx = kRenderFxNone , r = 0 , g = 0 , b = 0 , render = kRenderNormal , amount = 16 )
{
set_pev ( index , pev_renderfx , fx );
new Float : RenderColor [ 3 ];
RenderColor [ 0 ] = float ( r );
RenderColor [ 1 ] = float ( g );
RenderColor [ 2 ] = float ( b );
set_pev ( index , pev_rendercolor , RenderColor );
set_pev ( index , pev_rendermode , render );
set_pev ( index , pev_renderamt , float ( amount ));
}
Thanks in advance