恍若如梦 发表于 2005-3-16 01:27:24

【求助】希望能把此插件变成AMXX下使用(nwb13请进,源代码修改)

此插件作用为ucstats1.0统计loggs文件,用于amx下,但最近想把amx变成amxx,由于没法转变,自己也不太会C++语言,希望高人把此插件变成amxx下使用,多谢了!! :burn::burn::too_sad:

此插件有两个文件,ucstats_cstrike.sma和ucstats_live.sma,在amxx下ucstats_cstrike.sma可以通过编辑,但ucstats_live.sma出现问题了.

C:\Documents and Settings\Administrator\桌面\amxmodx_v1.01_cn_win\amxmodx\script
ing>amxxsc.exe ucstats_live.sma
Welcome to the AMX Mod X 1.00-272 Compiler.
Copyright (c) 1997-2004 ITB CompuPhase, AMX Mod X Team

ucstats_live.sma(21) : fatal error 100: cannot read from file: "udp"

Compilation aborted.
1 Error.
Could not locate output file ucstats_live.amx (compile failed).


插件名:ucstats_live.sma

源代码:



/*
*        AMXMOD script.
*        (ucstats_live.sma)
*        by mike_cao <mike@mikecao.com>
*        This file is provided as is (no warranties).
*
*        Provides a live server feed to UCStats.
*        You need to add the following cvars to your AMX config:
*
*        ucstats_live_ip <ip>
*        ucstats_live_port <port>
*
*        These cvars specify the ip and port of your live feed
*        daemon. This is the address the data will be sent to.
*
*
*/

#include <amxmod>
#include <amxmisc>
#include <udp>

#define MAX_NAME_LENGTH 32
#define MAX_VAR_LENGTH 64
#define MAX_PLAYERS 32
#define MAX_WEAPONS 32
#define MAX_TEXT_LENGTH 512
#define MAX_UDP_LENGTH 1024
#define MAX_CVARS 16
#define MIN_PLAYTIME 60

// Admin access level
#define ACCESS_LEVEL ADMIN_LEVEL_A

// Globals
new gIP
new gPort = 0
new gConnect = 0
new gSender = 0
new gScoreT = 0
new gScoreCT = 0
new gMapCycle
new gNetAddress
new gCvars[] = {"mp_timelimit","mp_autokick","mp_autoteambalance","mp_c4timer",
                                                        "mp_flashlight","mp_footsteps","mp_forcechasecam","mp_freezetime",
                                                        "mp_friendlyfire","mp_hostagepenalty","mp_roundtime","mp_startmoney",
                                                        "sv_aim","sv_cheats","sv_maxrate","sv_minrate"}

/************************************************************
* UDP FUNCTIONS
************************************************************/

// UDP Sender
public udp_send_msg(msg[])
{
        new sUDPMsg
        format(sUDPMsg,MAX_UDP_LENGTH,"%s^"%s",gNetAddress,msg)

        if (gSender == 0) {
               get_cvar_string("ucstats_live_ip",gIP,MAX_NAME_LENGTH)
               gPort = get_cvar_num("ucstats_live_port")
               gSender = set_iaddress(gIP,gPort)
        }

        if (send_udp_msg(gSender,sUDPMsg)) {
                server_print(" UDP SEND: <%s:%i>: %s",gIP,gPort,sUDPMsg)
        }
        else {
                server_print(" UDP FAILED: <%s:%i>: %s",gIP,gPort,sUDPMsg)
        }
}

public admin_livefeed(id,level,cid)
{
        if (!cmd_access(id,level,cid,0)) return PLUGIN_HANDLED

        new iPlayers, iNumPlayers, iMaxPlayers
        new sMsg, sName, sIP
        new sMap, sNextMap, sServer, sAddress, sServerTime
        new iIndex, iPing, iLoss, iKills, iDeaths, iTeam, iUserTime, iAlive
        new sAuthid
       
        // Get list of players
        get_players(iPlayers,iNumPlayers)
       
        // Send server info
        get_mapname(sMap,MAX_NAME_LENGTH)
        get_cvar_string("hostname",sServer,MAX_NAME_LENGTH)
        get_cvar_string("net_address",sAddress,MAX_NAME_LENGTH)
        get_cvar_string("amx_nextmap",sNextMap,MAX_VAR_LENGTH)
       
        if (!is_map_valid(sNextMap)) {
                copy(sNextMap,MAX_VAR_LENGTH,"")
        }
        get_time("%m/%d/%Y - %H:%M:%S",sServerTime,MAX_NAME_LENGTH)
       
        iMaxPlayers = get_maxplayers()
        if (iMaxPlayers > get_cvar_num("sv_visiblemaxplayers") && get_cvar_num("sv_visiblemaxplayers") > 0) {
                iMaxPlayers = get_cvar_num("sv_visiblemaxplayers")
        }

        // Send package header
        udp_send_msg("LIVEFEED^"BEGIN")
       
        // Format message
        // LIVEFEED"SERVER"name"address"numplayers"maxplayers"map"maptime"timeleft"connects"tscore"ctscore"server_time
        format(sMsg,MAX_UDP_LENGTH,"LIVEFEED^"SERVER^"%s^"%s^"%i^"%i^"%s^"%i^"%i^"%i^"%i^"%i^"%s^"%s",
        sServer,sAddress,iNumPlayers,iMaxPlayers,sMap,get_cvar_num("mp_timelimit"),(get_timeleft()/60),gConnect,gScoreT,gScoreCT,sServerTime,sNextMap)
        udp_send_msg(sMsg)

        // Send status of every player
        for (new i = 0; i < iNumPlayers; i++) {
                // Get data
                iIndex = iPlayers
                get_user_name(iIndex,sName,MAX_NAME_LENGTH)
                if (is_user_bot(iIndex)) {
                        format(sAuthid,MAX_NAME_LENGTH,"%s","BOT")
                }
                else {
                        get_user_authid(iIndex,sAuthid,MAX_NAME_LENGTH)
                }
                iKills = get_user_frags(iIndex)
                iDeaths = get_user_deaths(iIndex)
                iTeam = get_user_team(iIndex)
                iAlive = is_user_alive(iIndex)
                iUserTime = get_user_time(iIndex,1)
                get_user_ip(iIndex,sIP,MAX_NAME_LENGTH,1)
                get_user_ping(iIndex,iPing,iLoss)
       
                // Format message and send
                // LIVEFEED"PLAYER"index"name"authid"kills"deaths"team"alive"ping"playingtime"ip
                format(sMsg,MAX_UDP_LENGTH,"LIVEFEED^"PLAYER^"%i^"%s^"%s^"%i^"%i^"%i^"%i^"%i^"%i^"%s",
                iIndex,sName,sAuthid,iKills,iDeaths,iTeam,iAlive,iPing,iUserTime,sIP)
                udp_send_msg(sMsg)
        }
       
        // Send list of cvars
        // Format message and send
        // CVAR"name"value
        for (new i = 0; i < MAX_CVARS; i++) {
                format(sMsg,MAX_UDP_LENGTH,"LIVEFEED^"CVAR^"%s^"%i",gCvars,get_cvar_num(gCvars))
                udp_send_msg(sMsg)
        }

        // Send mapcycle
        // MAPCYCLE"map"map"map
        format(sMsg,MAX_UDP_LENGTH,"LIVEFEED^"MAPCYCLE^"%s",gMapCycle)
        udp_send_msg(sMsg)
       
        // Send package footer
        udp_send_msg("LIVEFEED^"END")
       
        return PLUGIN_CONTINUE
}

public admin_livechat(id,level,cid)
{
        if (!cmd_access(id,level,cid,3)) return PLUGIN_HANDLED

        // Get parameters
        new sArg1
        new sArg2
        read_argv(1,sArg1,MAX_NAME_LENGTH)
        read_argv(2,sArg2,MAX_TEXT_LENGTH)

        new iPlayer, iPlayers, iNumPlayers
        get_players(iPlayers,iNumPlayers,"c")

        for (new i = 0; i < iNumPlayers; i++) {
                iPlayer = iPlayers
                client_print(iPlayer,print_chat, "(WEB) %s :    %s",sArg1,sArg2)
        }
        console_print(id," LIVECHAT: %s: %s",sArg1,sArg2)

        // Make sure it comes back
        new sMsg

        // Format and send
        // LIVECHAT,say,player,team,message
        format(sMsg,MAX_UDP_LENGTH,"LIVECHAT^"%s^"%s^"%i^"%s","WEB",sArg1,0,sArg2)
        udp_send_msg(sMsg)

        return PLUGIN_CONTINUE
}

public bool:is_alpha(c)
{
        return ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) ? true : false
}

public get_mapcycle()
{
        new iLen, iIndex = 0
        new sFilename, sBuffer
        get_cvar_string("mapcyclefile",sFilename,MAX_VAR_LENGTH)
        if (file_exists(sFilename)) {
                while(read_file(sFilename,iIndex++,sBuffer,MAX_VAR_LENGTH,iLen)) {
                        if (is_alpha(sBuffer) && is_map_valid(sBuffer)) {
                                add(gMapCycle,MAX_TEXT_LENGTH,sBuffer,MAX_VAR_LENGTH)
                                add(gMapCycle,MAX_TEXT_LENGTH,"^"",1)
                        }
                }
        }
}

public send_mapchange()
{
        new sMsg
       
        // Format and send
        // LIVEEVENT,MAPCHANGE
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"MAPCHANGE")
        udp_send_msg(sMsg)
}

/************************************************************
* EVENT FUNCTIONS
************************************************************/

public event_death() {
        new iKiller = read_data(1)
        new iVictim = read_data(2)
        new iHeadshot = read_data(3)
        new sMsg
        new sKiller, sVictim, sWeapon
        new iKillerTeam, iVictimTeam
        new iWeapon, iBody

        get_user_attacker(iVictim,iWeapon,iBody)
        get_weaponname(iWeapon,sWeapon,MAX_NAME_LENGTH)
       
        get_user_name(iKiller,sKiller,MAX_NAME_LENGTH)
        get_user_name(iVictim,sVictim,MAX_NAME_LENGTH)
        iKillerTeam = get_user_team(iKiller)
        iVictimTeam = get_user_team(iVictim)
       
        // Format and send
        // LIVEEVENT,KILL,killer,team,victim,team,weapon,headshot
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"KILL^"%s^"%i^"%s^"%i^"%s^"%i",
        sKiller,iKillerTeam,sVictim,iVictimTeam,sWeapon,iHeadshot)
        udp_send_msg(sMsg)
       
        return PLUGIN_CONTINUE
}

public event_world_action()
{
        new sMsg
        new sAction
        read_logargv(1,sAction,MAX_VAR_LENGTH)       
       
        // Format and send
        // LIVEEVENT,WORLD,event
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"WORLD^"%s",sAction)
        udp_send_msg(sMsg)
       
        return PLUGIN_CONTINUE
}

public event_player_action()
{
        new iUserId
        new sArg
        new sName
        new sAction
       
        read_logargv(0,sArg,MAX_VAR_LENGTH)
        read_logargv(2,sAction,MAX_VAR_LENGTH)
        parse_loguser(sArg,sName,MAX_NAME_LENGTH,iUserId)

        new sMsg
        new sAuthid
        new iTeam
       
        if (is_user_bot(iUserId)) {
                format(sAuthid,MAX_NAME_LENGTH,"%s","BOT")
        }
        else {
                get_user_authid(iUserId,sAuthid,MAX_NAME_LENGTH)
        }
        iTeam = get_user_team(iUserId)
       
        // Format and send
        // LIVEEVENT,ACTION,name,team,action
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"ACTION^"%s^"%i^"%s^"%s",sName,iTeam,sAction)
        udp_send_msg(sMsg)
       
        return PLUGIN_CONTINUE
}

public event_say(id)
{
        new sMsg
        new sName
        new sCommand
        new sMessage
        new iTeam

        read_argv(0,sCommand,MAX_TEXT_LENGTH)
        read_argv(1,sMessage,MAX_TEXT_LENGTH)
        get_user_name(id,sName,MAX_NAME_LENGTH)
        iTeam = get_user_team(id)
       
        // Format and send
        // LIVECHAT,say,name,team,message
        format(sMsg,MAX_UDP_LENGTH,"LIVECHAT^"%s^"%s^"%i^"%s",sCommand,sName,iTeam,sMessage)
        udp_send_msg(sMsg)
       
        return PLUGIN_CONTINUE
}

public event_team_score(id)
{
        new sTeam
        read_data(1,sTeam,MAX_NAME_LENGTH)
        if (equal(sTeam,"CT")) {
                gScoreCT = read_data(2)
        }
        else {
                gScoreT = read_data(2)
        }
       
        return PLUGIN_CONTINUE
}

/************************************************************
* PLUGIN FUNCTIONS
************************************************************/

public plugin_end()
{
        send_mapchange()
        return PLUGIN_CONTINUE
}

public client_putinserver(id)
{
        new sMsg
        new sName
        new sIP
        new sAuthid
        new sMap, iNumPlayers, iMaxPlayers

        get_user_name(id,sName,MAX_NAME_LENGTH)
        if (is_user_bot(id)) {
                format(sAuthid,MAX_NAME_LENGTH,"%s","BOT")
        }
        else {
                get_user_authid(id,sAuthid,MAX_NAME_LENGTH)
        }
        get_user_ip(id,sIP,MAX_NAME_LENGTH,1)
       
        // Format and send
        // LIVEEVENT,JOINED,player,id,ip
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"JOINED^"%s^"%s^"%s",sName,sAuthid,sIP)
        udp_send_msg(sMsg)
       
        get_mapname(sMap,MAX_NAME_LENGTH)
        iNumPlayers = get_playersnum()
        iMaxPlayers = get_maxplayers()
        if (iMaxPlayers > get_cvar_num("sv_visiblemaxplayers") && get_cvar_num("sv_visiblemaxplayers") > 0) {
                iMaxPlayers = get_cvar_num("sv_visiblemaxplayers")
        }
       
        // LIVEEVENT,MAPSTATUS,map,numplayers,maxplayers
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"MAPSTATUS^"%s^"%i^"%i",sMap,iNumPlayers,iMaxPlayers)
        udp_send_msg(sMsg)
       
        return PLUGIN_CONTINUE
}

public client_connect(id)
{
        if (!is_user_bot(id)) {
                gConnect += 1
        }

        return PLUGIN_CONTINUE
}

public client_disconnect(id)
{
        new sMsg
        new sName
        new sIP
        new sAuthid
        new sMap, iNumPlayers, iMaxPlayers

        get_user_name(id,sName,MAX_NAME_LENGTH)
        if (is_user_bot(id)) {
                format(sAuthid,MAX_NAME_LENGTH,"%s","BOT")
        }
        else {
                get_user_authid(id,sAuthid,MAX_NAME_LENGTH)
        }
        get_user_ip(id,sIP,MAX_NAME_LENGTH,1)
       
        // Format and send
        // LIVEEVENT,JOINED,player,id,ip
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"LEFT^"%s^"%s^"%s",sName,sAuthid,sIP)
        udp_send_msg(sMsg)
       
        get_mapname(sMap,MAX_NAME_LENGTH)
        iNumPlayers = get_playersnum()-1
        iMaxPlayers = get_maxplayers()
        if (iMaxPlayers > get_cvar_num("sv_visiblemaxplayers") && get_cvar_num("sv_visiblemaxplayers") > 0) {
                iMaxPlayers = get_cvar_num("sv_visiblemaxplayers")
        }
       
        // LIVEEVENT,MAPSTATUS,map,numplayers,maxplayers
        format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"MAPSTATUS^"%s^"%i^"%i",sMap,iNumPlayers,iMaxPlayers)
        udp_send_msg(sMsg)

        return PLUGIN_CONTINUE
}

public client_infochanged(id)
{
        new sMsg
        new sName, sNewName

        get_user_name(id,sName,MAX_TEXT_LENGTH)
        get_user_info(id,"name",sNewName,MAX_TEXT_LENGTH)

        if (!equal(sName,sNewName) && !equal(sName,"") && !equal(sName,"(null)")) {
                // Format and send
                // LIVEEVENT,NAMECHANGE,name,newname
                format(sMsg,MAX_UDP_LENGTH,"LIVEEVENT^"NAMECHANGE^"%s^"%s",sName,sNewName)
                udp_send_msg(sMsg)
        }
        return PLUGIN_CONTINUE
}

public plugin_init() {
        register_plugin("Plugin UCStats (live)","1.0","mike_cao")
        register_srvcmd("amx_livefeed","admin_livefeed",ACCESS_LEVEL,"amx_livefeed")
        register_srvcmd("amx_livechat","admin_livechat",ACCESS_LEVEL,"amx_livechat <name> <message>")
       
        register_event("DeathMsg","event_death","a")
        register_event("TeamScore","event_team_score","a")
       
        register_logevent("event_player_action",3,"1=triggered")
        register_logevent("event_world_action",2,"0=World triggered")

        register_cvar("ucstats_live_ip","")
        register_cvar("ucstats_live_port","")

        // Init
        set_task(1.0,"send_mapchange")       
        set_task(2.0,"get_mapcycle")
       
        // Register say
        register_clcmd("say","event_say")
        register_clcmd("say_team","event_say")

        get_cvar_string("net_address",gNetAddress,MAX_NAME_LENGTH)
        if (strlen(gNetAddress) == 0) {
                format(gNetAddress,MAX_NAME_LENGTH,"%s","127.0.0.1");
        }
       
        // Initialize UDP session
        if (get_udp_status()) {
                server_print(" UDP initialized successfully.")
        }
        else {
                server_print(" Failed to initialize UDP.")
        }
       
        return PLUGIN_CONTINUE
}

wzf828 发表于 2005-3-16 02:47:21

可以直接编译的

恍若如梦 发表于 2005-3-16 03:25:42

Post by wzf828
可以直接编译的

如果能把源代码在贴出来就好了.
实在是太感谢了,这么快就有回复.支持在试!:) :too_sad::super:

恍若如梦 发表于 2005-3-16 03:29:18

好像不行,运行ucstats_live.amxx提示失败了!! :mad:

nwb13 发表于 2005-3-16 11:49:32

在1.0里udp被sockets所取代,但是偶还没搞清楚这个如何转,因为两者区别很大
建议先找找1.0下是否有udp模块可用,有的话就很方便了

恍若如梦 发表于 2005-3-16 15:43:22

Post by nwb13
在1.0里udp被sockets所取代,但是偶还没搞清楚这个如何转,因为两者区别很大
建议先找找1.0下是否有udp模块可用,有的话就很方便了


原先如果用AMX0.93下是有UDP模块,并且能正常使用,在AMXX下好像没有UDP模块这说法,而是变成了sockets,所以不知道能否转变呢。
一直以来都没用过AMXX,一直是用AMX0.93,也快一年多了,现在想转成AMXX,关键就是几个插件的转变了! :confused:

Raad 发表于 2005-4-3 02:26:49

挺深奥的啊,不懂:)
页: [1]
查看完整版本: 【求助】希望能把此插件变成AMXX下使用(nwb13请进,源代码修改)