Junior Member
05-14-2018
, 13:52
Re: WalkGuard FIX
#4
Quote:
Originally Posted by
lazarev
Spoiler
First of, entities with EF_NODRAW flag enabled on pev_effects parameter are not being networked to client hence shakiness effect.
Second, bbox should be reduced slightly for some reason when creating entities with SOLID_BBOX..
Try creating zones with this one:
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 )
set_pev ( entity , pev_rendermode , kRenderTransAlpha )
set_pev ( entity , pev_renderamt , 0.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 ] = { - 31.99 , - 31.99 , - 31.99 }
new Float : maxs [ 3 ] = { 31.99 , 31.99 , 31.99 }
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 %f %f %f" , output , pos [ 0 ], pos [ 1 ], pos [ 2 ])
// -> Dimensionen
format ( output , 999 , "%s %f %f %f" , output , mins [ 0 ], mins [ 1 ], mins [ 2 ])
format ( output , 999 , "%s %f %f %f" , 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 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
}
god bless you! thank you so much!