冰河 发表于 2009-1-7 00:50:31

插件1.5下不能读取配置的参数

是个限制区域的插件但是没解决1.5下保存后重新换图读取原来配置,高手帮看下那段代码出了问题,现在下附件要收费我就把代码拆分成几段。#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黷zung
        ZM_KILL_T2
}

new 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[] = { "wgz_none", "wgz_camper", "wgz_camper_t1", "wgz_camper_t2", "wgz_block_all", "wgz_kill", "wgz_kill_t1", "wgz_kill_t2" }
new solidtyp = { SOLID_NOT, SOLID_TRIGGER, SOLID_TRIGGER, SOLID_TRIGGER, SOLID_BBOX, SOLID_TRIGGER, SOLID_TRIGGER, SOLID_TRIGGER }
new zonecolor = {
        { 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 = { 0, 0, 255 }
new zone_color_red = { 255, 0, 0 }
new zone_color_green = { 255, 255, 0 }

// alle Zonen
#define MAXZONES 100
new zone
new maxzones                // soviele existieren
new index                // die aktuelle Zone

// Editier-Funktionen
new setupunits = 10        // 膎derungen an der Gr鲞e um diese Einheiten
new direction = 0        // 0 -> X-Koorinaten / 1 -> Y-Koords / 2 -> Z-Koords
new koordinaten[] = { "TRANSLATE_X_KOORD", "TRANSLATE_Y_KOORD", "TRANSLATE_Z_KOORD" }

new spr_dot                // ben鰐igt f黵 die Lininen

new editor = 0                // dieser Spieler ist gerade am erstellen .. Men?verkraftet nur einen Editor

new camperzone                // letzte Meldung der CamperZone
new Float:campertime        // der erste Zeitpunkt des eintreffens in die Zone
new Float:camping                // 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鰊nen nicht lesen
        pcv_immunity = register_cvar("wg_immunity", "0")                // Admins mit Immunit鋞 brauchen nicht
        pcv_direction = register_cvar("wg_direction", "1")        // zuf鋖lige Richtung beim Slap
        pcv_botdirection = register_cvar("wg_botdirection", "1") // dito f黵 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黱den 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
        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) {
                        client_print(player, print_center, "%L", player, "WALKGUARD_CAMPING_INIT")
                        // Gratulation ... Du wirst beobachtet
                        camperzone = zone
                        campertime = get_gametime()
                        camping = get_gametime()
                        set_task(0.5, "ZoneModeCamper", TASK_BASIS_CAMPER + player, _, _, "b")
                } else {
                        // immer fleissig mitz鋒len
                        camping = 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, " %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點kt ^^
                remove_task(TASK_BASIS_CAMPER + player)
                return
        }
       
        new Float:gametime = get_gametime();
        if ((gametime - camping) > 0.5)
        {
                // *juhu* ... wieder frei
                campertime = 0.0
                camping = 0.0
                remove_task(TASK_BASIS_CAMPER + player)
                return
        }

        new ct = pev(camperzone, CAMPERTIME)
        new left = ct - floatround( gametime - campertime)
        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
        velocity = random_float(-256.0, 256.0)
        velocity = random_float(-256.0, 256.0)
        velocity = random_float(-256.0, 256.0)
        set_pev(player, pev_velocity, velocity)
}

// -----------------------------------------------------------------------------------------
//
//        Zonenerstellung
//
// -----------------------------------------------------------------------------------------
public CreateZone(Float:position, Float:mins, Float:maxs, 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)
        }
       
        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, campertime)
       
        return entity
}

public CreateNewZone(Float:position) {
        new Float:mins = { -32.0, -32.0, -32.0 }
        new Float:maxs = { 32.0, 32.0, 32.0 }
        return CreateZone(position, mins, maxs, 0, 10);        // ZM_NONE
}

public CreateZoneOnPlayer(player) {
        // Position und erzeugen
        new Float:position
        pev(player, pev_origin, position)
       
        new entity = CreateNewZone(position)
        FindAllZones()
       
        for(new i = 0; i < maxzones; i++) if (zone == entity) index = i;
}

冰河 发表于 2009-1-7 00:52:39

// -----------------------------------------------------------------------------------------
//
//        Load & Save der WGZ
//
// -----------------------------------------------------------------------------------------
public SaveWGZ(player) {
        new zonefile
        new mapname

        // Verzeichnis holen
        get_configsdir(zonefile, 199)
        format(zonefile, 199, "%s/walkguard", zonefile)
        if (!dir_exists(zonefile)) mkdir(zonefile)
       
        // Namen 黚er 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        // das Entity
               
                // diverse Daten der Zone
                new zm = pev(z, ZONEID)
               
                // Koordinaten holen
                new Float:pos
                pev(z, pev_origin, pos)
               
                // Dimensionen holen
                new Float:mins, Float:maxs
                pev(z, pev_mins, mins)
                pev(z, pev_maxs, maxs)
               
                // Ausgabe formatieren
                //-> Type und CamperTime
                new output
                format(output, 999, "%s", zonename)
                //-> Position
                format(output, 999, "%s %.1f %.1f %.1f", output, pos, pos, pos)
                //-> Dimensionen
                format(output, 999, "%s %.0f %.0f %.0f", output, mins, mins, mins)
                format(output, 999, "%s %.0f %.0f %.0f", output, maxs, maxs, maxs)
               
                // 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
        new mapname

        // Verzeichnis holen
        get_configsdir(zonefile, 199)
        format(zonefile, 199, "%s/walkguard", zonefile)
       
        // Namen 黚er Map erstellen
        get_mapname(mapname, 49)
        format(zonefile, 199, "%s/walkguard/%s.wgz", zonefile, mapname)
       
        if (!file_exists(zonefile))
        {
                log_amx("no zone-file found")
                return
        }
       
        // einlesen der Daten
        new input, line = 0, len
       
        while( (line = read_file(zonefile , line , input , 127 , len) ) != 0 )
        {
                if (!strlen(input)|| (input == ';')) continue;        // Kommentar oder Leerzeile

                new data, zm = 0, ct                // "abgebrochenen" Daten - ZoneMode - CamperTime
                new Float:mins, Float:maxs, Float:pos        // Gr鲞e & Position

                // Zone abrufen
                strbreak(input, data, 20, input, 999)
                zm = -1
                for(new i = 0; ZONEMODE:i < ZONEMODE; ZONEMODE:i++)
                {
                        // 膎derungen 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)) zm = i;
                }
               
                if (zm == -1)
                {
                        log_amx("undefined zone -> '%s' ... dropped", data)
                        continue;
                }
               
                // Position holen
                strbreak(input, data, 20, input, 999);        pos = str_to_float(data);
                strbreak(input, data, 20, input, 999);        pos = str_to_float(data);
                strbreak(input, data, 20, input, 999);        pos = str_to_float(data);
               
                // Dimensionen
                strbreak(input, data, 20, input, 999);        mins = str_to_float(data);
                strbreak(input, data, 20, input, 999);        mins = str_to_float(data);
                strbreak(input, data, 20, input, 999);        mins = str_to_float(data);
                strbreak(input, data, 20, input, 999);        maxs = str_to_float(data);
                strbreak(input, data, 20, input, 999);        maxs = str_to_float(data);
                strbreak(input, data, 20, input, 999);        maxs = 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, Float:sizemax, color, life) {
        // FX
        message_begin(MSG_ALL, SVC_TEMPENTITY);

        write_byte(31);
       
        write_coord( floatround( sizemin ) ); // x
        write_coord( floatround( sizemin ) ); // y
        write_coord( floatround( sizemin ) ); // z
       
        write_coord( floatround( sizemax ) ); // x
        write_coord( floatround( sizemax ) ); // y
        write_coord( floatround( sizemax ) ); // z

        write_short(life)        // Life
       
        write_byte(color)        // Color R / G / B
        write_byte(color)
        write_byte(color)
       
        message_end();
}

public FX_Line(start, stop, color, brightness) {
        message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, editor)
       
        write_byte( TE_BEAMPOINTS )
       
        write_coord(start)
        write_coord(start)
        write_coord(start)
       
        write_coord(stop)
        write_coord(stop)
        write_coord(stop)
       
        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 )   // r, g, b
        write_byte( color )   // r, g, b
        write_byte( color )   // 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) {
        new start
        new stop
       
        start = floatround( x1 )
        start = floatround( y1 )
        start = floatround( z1 )
       
        stop = floatround( x2 )
        stop = floatround( y2 )
        stop = 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
                remove_task(TASK_BASIS_SHOWZONES + z)
                set_pev(z, pev_solid, SOLID_NOT)
                set_task(0.2, "ShowZoneBox", TASK_BASIS_SHOWZONES + z, _, _, "b")
        }
}

冰河 发表于 2009-1-7 00:53:08

public ShowZoneBox(entity) {
        entity -= TASK_BASIS_SHOWZONES
        if ((!fm_is_valid_ent(entity)) || !editor) return

        // Koordinaten holen
        new Float:pos
        pev(entity, pev_origin, pos)
        if (!fm_is_in_viewcone(editor, pos) && (entity != zone)) return                // sieht der Editor eh nicht

        // jetzt vom Editor zur Zone testen... Zonen hinter der Wand aber im ViewCone
        // m黶sen nicht gezeichnet werden
        new Float:editorpos
        pev(editor, pev_origin, editorpos)
        new Float:hitpoint        // da ist der Treffer
        fm_trace_line(-1, editorpos, pos, hitpoint)

        // Linie zur Zone zeichnen ... dann wird sie schneller gefunden
        if (entity == zone) DrawLine(editorpos, editorpos, editorpos - 16.0, pos, pos, pos, { 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)) return                        // hinter einer Wand

        // -+*+-   die Zone muss gezeichnet werden   -+*+-

        // Dimensionen holen
        new Float:mins, Float:maxs
        pev(entity, pev_mins, mins)
        pev(entity, pev_maxs, maxs)

        // Gr鲞e in Absolut umrechnen
        mins += pos
        mins += pos
        mins += pos
        maxs += pos
        maxs += pos
        maxs += pos
       
        new id = pev(entity, ZONEID)
       
        new color
        color = (zone == entity) ? zone_color_aktiv : zonecolor
        color = (zone == entity) ? zone_color_aktiv : zonecolor
        color = (zone == entity) ? zone_color_aktiv : zonecolor
       
        // einzelnen Linien der Box zeichnen
        //-> alle Linien beginnen bei maxs
        DrawLine(maxs, maxs, maxs, mins, maxs, maxs, color)
        DrawLine(maxs, maxs, maxs, maxs, mins, maxs, color)
        DrawLine(maxs, maxs, maxs, maxs, maxs, mins, color)
        //-> alle Linien beginnen bei mins
        DrawLine(mins, mins, mins, maxs, mins, mins, color)
        DrawLine(mins, mins, mins, mins, maxs, mins, color)
        DrawLine(mins, mins, mins, mins, mins, maxs, color)
        //-> die restlichen 6 Lininen
        DrawLine(mins, maxs, maxs, mins, maxs, mins, color)
        DrawLine(mins, maxs, mins, maxs, maxs, mins, color)
        DrawLine(maxs, maxs, mins, maxs, mins, mins, color)
        DrawLine(maxs, mins, mins, maxs, mins, maxs, color)
        DrawLine(maxs, mins, maxs, mins, mins, maxs, color)
        DrawLine(mins, mins, maxs, mins, maxs, maxs, color)

        // der Rest wird nur gezeichnet wenn es sich um ide aktuelle Box handelt
        if (entity != zone) return
       
        // jetzt noch die Koordinaten-Linien
        if (direction == 0)        // X-Koordinaten
        {
                DrawLine(maxs, maxs, maxs, maxs, mins, mins, zone_color_green)
                DrawLine(maxs, maxs, mins, maxs, mins, maxs, zone_color_green)
               
                DrawLine(mins, maxs, maxs, mins, mins, mins, zone_color_red)
                DrawLine(mins, maxs, mins, mins, mins, maxs, zone_color_red)
        }
        if (direction == 1)        // Y-Koordinaten
        {
                DrawLine(mins, mins, mins, maxs, mins, maxs, zone_color_red)
                DrawLine(maxs, mins, mins, mins, mins, maxs, zone_color_red)

                DrawLine(mins, maxs, mins, maxs, maxs, maxs, zone_color_green)
                DrawLine(maxs, maxs, mins, mins, maxs, maxs, zone_color_green)
        }       
        if (direction == 2)        // Z-Koordinaten
        {
                DrawLine(maxs, maxs, maxs, mins, mins, maxs, zone_color_green)
                DrawLine(maxs, mins, maxs, mins, maxs, maxs, zone_color_green)

                DrawLine(maxs, maxs, mins, mins, mins, mins, zone_color_red)
                DrawLine(maxs, mins, mins, mins, maxs, mins, zone_color_red)
        }
}

public HideAllZones() {
        editor = 0        // Men?f黵 den n鋍hsten wieder frei geben ... ufnktionalit鋞 aktivieren
        for(new i = 0; i < maxzones; i++)
        {
                new id = pev(zone, ZONEID)
                set_pev(zone, pev_solid, solidtyp)
                remove_task(TASK_BASIS_SHOWZONES + zone)
        }
}

public FindAllZones() {
        new entity = -1
        maxzones = 0
        while( (entity = fm_find_ent_by_class(entity, "walkguardzone")) )
        {
                zone = entity
                maxzones++
        }
}

public InitWalkGuard(player) {
        new name, steam
        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
        new menu
        new zm = -1
        new ct
        new menukeys = MENU_KEY_0 + MENU_KEY_4 + MENU_KEY_9
       
        if (fm_is_valid_ent(zone))
        {
                zm = pev(zone, ZONEID)
                ct = pev(zone, 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)
                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)) OpenEditMenu(player); else OpenWalkGuardMenu(player);
                        }
                case 2: {
                                // vorherige Zone
                                index = (index > 0) ? index - 1 : index;
                                OpenWalkGuardMenu(player)
                        }
                case 3: {
                                // n鋍hste Zone
                                index = (index < maxzones - 1) ? index + 1 : index;
                                OpenWalkGuardMenu(player)
                        }
                case 4:        {
                                // neue Zone 黚er 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鰏chen
                                OpenKillMenu(player);
                        }
                case 9: {
                                // Zonen speichern
                                SaveWGZ(player)
                                OpenWalkGuardMenu(player)
                        }
                case 10:{
                                editor = 0
                                HideAllZones()
                        }
        }
}

冰河 发表于 2009-1-7 00:53:30

public OpenEditMenu(player) {
        new trans
       
        new menu
        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))
        {
                zm = pev(zone, ZONEID)
                ct = pev(zone, CAMPERTIME)
        }
       
        if (zm != -1)
        {
                format(trans, 69, "%L", player, zonemode)
                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)
        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鋍hster ZoneMode
                                new zm = -1
                                zm = pev(zone, ZONEID)
                                if (ZONEMODE:zm == ZM_KILL_T2) zm = 0; else zm++;
                                set_pev(zone, ZONEID, zm)
                                OpenEditMenu(player)
                        }
                case 2: {
                                // Campertime runter
                                new ct = pev(zone, CAMPERTIME)
                                ct = (ct > 5) ? ct - 1 : 5
                                set_pev(zone, CAMPERTIME, ct)
                                OpenEditMenu(player)
                        }
                case 3: {
                                // Campertime hoch
                                new ct = pev(zone, CAMPERTIME)
                                ct = (ct < 30) ? ct + 1 : 30
                                set_pev(zone, CAMPERTIME, ct)
                                OpenEditMenu(player)
                        }
                case 4: {
                                // Editier-Richtung 鋘dern
                                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 鋘dern
                                setupunits = (setupunits < 100) ? setupunits * 10 : 1
                                OpenEditMenu(player)
                        }
                case 10:{
                                OpenWalkGuardMenu(player)
                        }
        }
}

public VonRotAbziehen() {
        new entity = zone
       
        // Koordinaten holen
        new Float:pos
        pev(entity, pev_origin, pos)

        // Dimensionen holen
        new Float:mins, Float:maxs
        pev(entity, pev_mins, mins)
        pev(entity, pev_maxs, maxs)

        // k鰊nte Probleme geben -> zu klein
        //if ((floatabs(mins) + maxs) < setupunits + 1) return
       
        mins -= float(setupunits) / 2.0
        maxs += float(setupunits) / 2.0
        pos -= float(setupunits) / 2.0
       
        set_pev(entity, pev_origin, pos)
        fm_entity_set_size(entity, mins, maxs)
}

public ZuRotAddieren() {
        new entity = zone
       
        // Koordinaten holen
        new Float:pos
        pev(entity, pev_origin, pos)

        // Dimensionen holen
        new Float:mins, Float:maxs
        pev(entity, pev_mins, mins)
        pev(entity, pev_maxs, maxs)

        // k鰊nte Probleme geben -> zu klein
        if ((floatabs(mins) + maxs) < setupunits + 1) return

        mins += float(setupunits) / 2.0
        maxs -= float(setupunits) / 2.0
        pos += float(setupunits) / 2.0
       
        set_pev(entity, pev_origin, pos)
        fm_entity_set_size(entity, mins, maxs)
}

public VonGelbAbziehen() {
        new entity = zone
       
        // Koordinaten holen
        new Float:pos
        pev(entity, pev_origin, pos)

        // Dimensionen holen
        new Float:mins, Float:maxs
        pev(entity, pev_mins, mins)
        pev(entity, pev_maxs, maxs)

        // k鰊nte Probleme geben -> zu klein
        if ((floatabs(mins) + maxs) < setupunits + 1) return

        mins += float(setupunits) / 2.0
        maxs -= float(setupunits) / 2.0
        pos -= float(setupunits) / 2.0
       
        set_pev(entity, pev_origin, pos)
        fm_entity_set_size(entity, mins, maxs)
}

public ZuGelbAddieren() {
        new entity = zone
       
        // Koordinaten holen
        new Float:pos
        pev(entity, pev_origin, pos)

        // Dimensionen holen
        new Float:mins, Float:maxs
        pev(entity, pev_mins, mins)
        pev(entity, pev_maxs, maxs)

        // k鰊nte Probleme geben -> zu klein
        //if ((floatabs(mins) + maxs) < setupunits + 1) return

        mins -= float(setupunits) / 2.0
        maxs += float(setupunits) / 2.0
        pos += float(setupunits) / 2.0
       
        set_pev(entity, pev_origin, pos)
        fm_entity_set_size(entity, mins, maxs)
}

public OpenKillMenu(player) {
        new menu
       
        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, " %L", player, "ZONE_KILL_NO")
                        }
                case 10:{
                                fm_remove_entity(zone)
                                index--;
                                if (index < 0) index = 0;
                                client_print(player, print_chat, " %L", player, "ZONE_KILL_YES")
                                FindAllZones()
                        }
        }
        OpenWalkGuardMenu(player)
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") {
        if (classname)
                set_kvd(0, KV_ClassName, classname)
        else {
                new class
                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, const Float:maxs)
        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
        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) {
        new Float:mins, Float:maxs
        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) {
        new Float:angles
        pev(index, pev_angles, angles)
        engfunc(EngFunc_MakeVectors, angles)
        global_get(glb_v_forward, angles)
        angles = 0.0

        new Float:origin, Float:diff, Float:norm
        pev(index, pev_origin, origin)
        xs_vec_sub(point, origin, diff)
        diff = 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, const Float:end, Float:ret) {
        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
}

zwfgdlc 发表于 2009-1-7 11:17:15

本帖最后由 zwfgdlc 于 2009-1-7 11:27 编辑

因为CS1.5里没有"HLTV"这个事件.试下这个.

BTW:真想骂人.上传个SMA文件也不可以.下载个附件也要扣点.连个PHP标签也不支持.

冰河 发表于 2009-1-7 11:28:26

哈,谢谢楼上的了,我明白了,我试下可以不如果还不行我就把jim那段1.5替换HLTV的代码修改上去。

jim_yang 发表于 2009-1-7 11:54:25

如果不是非要强调新一局的开始,其实用Round_Start就行了,区别就在于round start是在freeze time结束会的新一局开始,也就是玩家可以行动。毕竟我提供的那种方法效率不够高(基于字符串比较,而且那个函数本身被调用的很频繁)
页: [1]
查看完整版本: 插件1.5下不能读取配置的参数