Mo_be_blue 发表于 2013-7-6 13:28:48

Admin_radar插件的问题

就是管理员在雷达上看到所有人的插件
在CS1.6里能用,没什么问题

但是到CS1.5里用这个插件,一当土匪就自动退出,显示如下图

按确定就退了


求大神们解答/* * * * * * * * * * * * * * * * * * * * * * * *
*    Admin_radar, by BlueRaja (AMX Mod X)   *
*                                             *
*      Special thanks to Damaged Soul         *
* - not just for helping me when I needed it, *
*    but for putting up with all my shit ^_^*
*                                             *
*          (c) Copyright 2004               *
* This file is provided as is (no warranties) *
* * * * * * * * * * * * * * * * * * * * * * * */


//Includes
#include <amxmodx>
#include <cstrike> //used for cs_get_user_team

//Defines
#define ACCESS_LEVEL ADMIN_RCON //Default required admin level - don't want too many admins to have it, for the sake of speed
#define REFRESH_TIME 1.0      //Amount of time, in seconds, between radar-refreshings

//Messages
new gmsgBombDrop                //Dropping of the bomb
new gmsgHostagePos        //Position of hostage(s)
new gmsgHostageK                //Hostage has been killed

//Globals
new g_aAdminList, g_iAdminNum
new g_aCTList, g_iCTNum
new g_aTList, g_iTNum
new g_iEnemyCounter, g_iHostageCounter //Both are used for keeping track of the enemy
new g_iHostageModNum //Number with which to modulus hostage number; used to,
                     //if there are less than 4 T's, kill a fake-hostage blip.
new bool:g_bBombHeld

//Refreshes the list of admins
public refresh_admin()
{
        new aTemp, iTempNum
        get_players(aTemp, iTempNum, "c")//Skip bots

        g_iAdminNum=0
        for (new i=0; i<iTempNum; i++) {
                if (get_user_flags(aTemp)&ACCESS_LEVEL) {
                        g_aAdminList=aTemp
                        g_iAdminNum++
                }//end if
        }//end for
        return PLUGIN_HANDLED
}//end refresh_admin

//Refresh list of terrorists
public refresh_t() {
        get_players(g_aTList, g_iTNum, "ae", "TERRORIST")
        if (g_iTNum<4 && g_iHostageModNum!=g_iTNum) {
                g_iHostageModNum=g_iTNum //Only modulus with this number now

                //If there are three players left, then we want to fake-kill the fourth fake-hostage,
                //so that there aren't two blips on the radar for one player
                for(new i=0; i<g_iAdminNum; i++) {
                        if (cs_get_user_team(g_aAdminList)==CS_TEAM_CT) {
                                message_begin(MSG_ONE, gmsgHostageK, {0,0,0}, g_aAdminList)
                                write_byte(g_iTNum+1)        //Hostage to take off of radar
                                message_end()
                        }//end if
                }//end for
        }//end if
}//end refresh_t()

//Refresh list of CT's
#define refresh_ct() get_players(g_aCTList, g_iCTNum, "ae", "CT")
        //I wanted the above to be an inline function, but I don't think Small supports that,
        // so I used a macro instead

//This function will be called every second; it should display a single blip for a certain player
public radar_event(id)
{
        if(!g_iAdminNum || !g_iCTNum || !g_iTNum) return PLUGIN_HANDLED

        new iEnemyT = g_aTList //Cycle through the living Ts
        new iCoordsT
        get_user_origin(iEnemyT, iCoordsT)

        new iEnemyCT = g_aCTList
        new iCoordsCT
        get_user_origin(iEnemyCT, iCoordsCT)

        new iHostageNum = (g_iHostageCounter++)%g_iHostageModNum + 1

        for(new i=0; i<g_iAdminNum; i++)
        {
                //At this point, we know we want to send the message to the admin
                if (cs_get_user_team(g_aAdminList)==CS_TEAM_T) {                       
                        if (g_bBombHeld) { //If bomb is on the ground, the admins need to see it on their radar
                                message_begin(MSG_ONE, gmsgBombDrop, {0,0,0}, g_aAdminList)
                                write_coord(iCoordsCT)        //X Coordinate
                                write_coord(iCoordsCT)        //Y Coordinate
                                write_coord(iCoordsCT)        //Z Coordinate
                                write_byte(0)                        //?? This byte seems to always be 0...so, w/e
                                message_end()
                        }
                }
                else { //assume player is CT
                        message_begin(MSG_ONE, gmsgHostagePos, {0,0,0}, g_aAdminList)
                        write_byte(1)                        //No idea what this byte does; I think it has something to do with whether or not the hostage is following someone
                        write_byte(iHostageNum)                //The number of the hostage, 1-4
                        write_coord(iCoordsT)        //X Coordinate
                        write_coord(iCoordsT)        //Y Coordinate
                        write_coord(iCoordsT)        //Z Coordinate
                        message_end()
                }//end if
        }//end for
        return PLUGIN_HANDLED
}//end radar_event

//Called at round start
public RoundStart()
{
        new Float:fRoundTime = get_cvar_float("mp_roundtime") * 60.0
        new iTimeLeft = read_data(1)

        if (fRoundTime == iTimeLeft) { //Roundstart after freezetime
                g_iHostageCounter = 0
                g_iEnemyCounter   = 0
                g_iHostageModNum= 4
                g_bBombHeld       = true
                refresh_t()
                refresh_ct()

                //The hostage "killed" is only #(g_iTNum+1); however, apparently when the engine receieves a HostagePos message,
                //It assumes there are four hostages.Therefore, when playing with less than three people, the hostages not represented
                //by players and not yet killed are set, by default, at the center of the map.To fix this, I'll have to kill hostage #4
                //(if there are two players) or hostages #3 & #4 (if there is only one player)
                if (g_iTNum<3) {
                        for (new i=g_iTNum+2; i<=4; i++) {
                                for(new j=0; j<g_iAdminNum; j++) {
                                        message_begin(MSG_ONE, gmsgHostageK, {0,0,0}, g_aAdminList)
                                        write_byte(i)        //Hostage to take off of radar
                                        message_end()
                                }//end for
                        }//end for
                }//end if
        }//end if
        return PLUGIN_CONTINUE
}//end RoundStart

//Initialization
public plugin_init()
{
        gmsgBombDrop   = get_user_msgid("BombDrop")
        gmsgHostagePos = get_user_msgid("HostagePos")
        gmsgHostageK   = get_user_msgid("HostageK")
        register_event("RoundTime", "RoundStart", "bc")
        register_event("BombDrop", "Bomb_Drop", "bc")
        register_event("BombPickup", "Bomb_Pickup", "bc")
        register_plugin("Admin Radar","1.1","BlueRaja")
        register_concmd("amx_refresh","refresh_admin",ACCESS_LEVEL," - refresh admin slots(adminradar)")
        set_task(REFRESH_TIME, "radar_event", _, _, _, "b")
        return PLUGIN_CONTINUE
}

//refresh list on client connect/disconnect
public client_authorized(id)
{
        refresh_admin()
}
public client_disconnect(id)
{
        refresh_admin()
        refresh_t()
        refresh_ct()
}

//Refresh list of players on client death
public client_kill(id)//Called when a player kills himself
{
        if (cs_get_user_team(id)==CS_TEAM_T) {
                refresh_t()
        }
        else{
                refresh_ct()
        }
}

public client_death(killer, victim, weapon, hitplace, TK) //Called when a player dies
{
        if (cs_get_user_team(victim)==CS_TEAM_T) {
                refresh_t()
        }
        else{
                refresh_ct()
        }
}

public Bomb_Drop()
{
        g_bBombHeld = false
}

public Bomb_Pickup()
{
        g_bBombHeld = true
}插件源码如上,这是什么问题,如何解决?

rsdtt 发表于 2013-8-7 14:05:23

对1.5没有研究,不知道

verysym 发表于 2013-10-16 08:06:27

从来没研究过1.5 1.6到是可以实现
页: [1]
查看完整版本: Admin_radar插件的问题