Jump to content
GIGN Forum

Counter-strike Monitor


Recommended Posts

Counter-strike web monitor

Tātad izveidoju counter-strike monitoru, kurš ar pluginu (amxx) palīdzību pārsūta vajadzīgos datus uz noteiktu datubāzi.

Instalācija:

1. cs_monitor2009.amxx ievietojam plugins mapē

2. configs mapē:

* plugins.ini ierakstam plugina nosaukumu

* modules.ini atķeksējam mysql datubāzi

* amxx.cfg ierakstam datus (nav obligāts pasākums, ja vajadzīgie dati tiek ierakstīti plugina *.sma failā! )

monitor_host localhost

monitor_uname ?login

monitor_upw password

monitor_dbname monitor

3. Šeit ir 2 varianti... mēs varam palaist serveri un cerēt, ka plugins pats izveidos datubāzi?vai, ja nav slinkums, phpmyadmin veidojam jaunu datubāzi ar nosaukumu, kuru jūs ievadījāt cvarā "monitor_dbname" (def: monitor) .?

Ja jūs nolēmāt uzreiz palaist serveri un servera konsolē jums tiek pateikts, ka plugins nevar atrast datubāzi/datubāze nav izvēlēta, tad jums nāksies izveidot datubāzi manuāli caur phpmyadmin.

Vajadzīgas tabulas plugins izveido pats.

Web mapītē ir arī paraugs, ko plugins var izvilkt no datubāzēm, kas var būt parādīts mājas lapā.

Vēl ir viens papildus cvars:

monitor_update 15.0

Defaultā tas ir uzlikts uz 15 sekundēm, cvarā norādītais laiks ir laiks ar kādu intensitāti plugins atjaunos datus.

Tabulas:

players

?*) pl_name // Spēlētāja niks?

?*) pl_frags // Spēlētāja fragu skaits

?*) pl_death // Spēlētāja nāvju skaits

?*) pl_team // Spēlētāja komandas nosaukuma pirmais burts (U, C, T, S)

?*) pl_ip // Spēlētāja IP addrese + protokols laikam arī iet līdz

?*) pl_admin // ?Ja spēlētājs ir admins, vērtība ir 1, ja parasts spēlētājs 0

other

?*) curmap // Karte, kura ir pašlaik

?*) nextmap // Nākamā karte

?*) timelimit // mp_timelimit

?*) timeleft // amx_timeleft

?*) scoret // Teroristu uzvaru skaits

?*) scorect // Ct uzvaru skaits

?*) curpl // Pašreizējais spēlētāju sk.

?*) maxpl // Maksimālais spēlētāju sk.

Ja par pluginu rodas jautājumi, ja plugins strādā nekorekti (diemžēl nav iespējas pilnībā? iztestēt, nevaru atvērt portu/vai kas tur? ), ir kādi ieteikumi, tad postojiet zemāk...

cs_monitor.zip

Edited by remix.cc
Link to comment
Share on other sites

1. Salasāmi ar atstarpēm un pārējiem šitiem. Nedari šādi:

public funckija() {
    dsadas
    fsadadsa
}
public funkcija() {
}

Dari šādi(ievēro vienu atstarpi):

public funckija() {
    dsadas
    fsadadsa
}

public funkcija() {
}

2. Skaidrākus funkcijas nosaukumus(tādi, kas pastāsta, par ko ir runa). Ko nozīmē public MK()? Kas ir MK? Mortal Kombat?

3. Pcvarus ieteiktu apvienot vienā arrajā un izveido g_Query, lai nav jāveido katru reizi jauns:

enum SQL_INFO
{
    HOST,
    USER,
    PASSWORD,
    DATABASE,
    UPDATE
}

new g_Query[256]

new c_MySqlInfo[SQL_INFO]

public plugin_init() {

    c_MySqlInfo[SQL_INFO:HOST] = register_cvar("monitor_host","localhost")
    c_MySqlInfo[SQL_INFO:USER] = register_cvar("monitor_uname","root")
    c_MySqlInfo[SQL_INFO:PASSWORD] = register_cvar("monitor_upw","123")
    c_MySqlInfo[SQL_INFO:DATABASE] = register_cvar("monitor_dbname","monitor")
    c_MySqlInfo[SQL_INFO:UPDATE] = register_cvar("monitor_update","15.0")
}

//un pie connect
public DatabaseConnect() {

    new MySqlInfo[SQL_INFO][64]
    
    get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:HOST],63)
    get_pcvar_string(c_MySqlInfo[SQL_INFO:USER],MySqlInfo[SQL_INFO:USER],63)
    get_pcvar_string(c_MySqlInfo[SQL_INFO:PASSWORD],MySqlInfo[SQL_INFO:PASSWORD],63)
    get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:DATABASE],63)
    
    formatex(g_Query,255,"CREATE DATABASE IF NOT EXISTS %s",MySqlInfo[SQL_INFO:DATABASE])

    SendQuery(g_Query)
}

4. Kāpēc tu taisi lieku boolu - db_created, nebūtu vieglāk tam "startloop()" uzlikt tasku uz 1.0? Tāpat, ja neizdosies izveidot datubāzi tu izmanto set_fail_state, kas apstādina pluginu.

5.

new Float:timef = get_pcvar_float(pcvar5)

Totāls fails, liec pa taisno iekšā:

set_task(get_pcvar_float(pcvar5),"update_all",_,_,_,"b")

6. Vispār liec šo plugin_init:

set_task(get_pcvar_float(pcvar5), "update_all", _ , _ , _ , "b")

un to papildus funkciju nodzēs.

7.

public rr()
    update_details(0,0)

*Atstarpes no citām funkcijām.

*

public rr() update_details(0,0)

OR

public rr() {

update_details(0,0)
}

8.

is_admin[id] = false
if(is_user_bot(id) || is_user_hltv(id)) return PLUGIN_HANDLED

if(get_user_flags(id) & ADMIN_BAN) is_admin[id] = true

Lieto else pie flag check:

if(is_user_bot(id) || is_user_hltv(id)) return PLUGIN_HANDLED

if(get_user_flags(id) & ADMIN_BAN) {

is_admin[id] = true
}
else {

is_admin[id] = false
}

Citādi, ja ir admins, tad 2 reizes tiek mainīta bool vērtība.

9.

new score_teamct = 0, score_teamt = 0

Nav jēga likt = 0, šis nav C++, bet ir pawn.

10.

new maxplayers = 33

Pff, vai nu:

#define MAXPLAYERS 33

or raksti to pirms aiz funkcijas(global - karoče virs plugin_init tavā gadījumā).

Tu saproti, ka tu veido jaunu mainīgo un piešķir tam vērtību, ik pa 15 sec?

11.

for(new i=0; i<maxplayers; i++)
{
    if(is_user_connected(i) && !is_user_bot(i) && !is_user_hltv(i))
    {
        udp2(i)
    }
}

Beidzot, kaut kas acīm kaut cik tīkams. (applause).

12. Veido domājošu entity taska vietā:

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

new pcvar5

new g_HandlerEnt

public plugin_init() {
    
    //Tavs kods
    pcvar5 = register_cvar("monitor_update", "15.0")
    
    RegisterHam(Ham_Think,"info_target","HandlerThink",1)
    
    MakeHandler()
}

public MakeHandler() {
    
    g_HandlerEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    
//Classname nav obligāts. Dzēs šo rindiņu ārā. Es šo uzrakstīju tāpat...
    set_pev(g_HandlerEnt,pev_classname,"shine_largerthan_3rmx")
    
    set_pev(g_HandlerEnt,pev_nextthink,get_gametime() + get_pcvar_float(pcvar5))
}

public HandlerThink(Ent) {
    
    if(Ent == g_HandlerEnt) {
        
        //UPDATE
    }
}

Neuztraucies, ka tiek inklūdoti 2 moduļi, tomēr labāks par tasku :).

13. Kāds ADMIN_CVAR? Neliec to >

pcvar5 = register_cvar("monitor_update", "15.0", ADMIN_CVAR)

>

pcvar5 = register_cvar("monitor_update", "15.0")

14.

is_admin[id] = false

if(get_user_flags(id) & ADMIN_BAN) is_admin[id] = true

Atkal... izmanto else.

15.

new ErC, Handle:sqlc = SQL_Connect(tuple, ErC, gerror, 511)

Error un Handle:sqlc izveido kā globalos mainīgos, lai katru reizi nav jātaisa jauni.

16.

get_cvar_string("amx_nextmap", nextmap, 32)
get_cvar_string("mp_timelimit", timelimit, 9)
get_cvar_string("amx_timeleft", timeleft, 9)

Izmanto cvar pointerus un iegūsti šos stringus kā pcvarus, jo viņš katru reizi burās cauri visiem cvariem kamēr atrod šos, un šie ir beigās tāpēc šis ēd

resus :). Šādi:

new cp_nextmap

public plugin_init() {
    
    cp_nextmap = get_cvar_pointer("amx_nextmap")
}

public iownrmx() {
    
    new Nextmap[33]
    
    get_pcvar_string(cp_nextmap,Nextmap,32)
}

17.

maxpl = get_maxplayers()

Lieto globalo mainīgo.

18.

if(!first_update) {
    new Handle:query = SQL_PrepareQuery(sqlc, "INSERT INTO other (curmap , nextmap , timelimit , timeleft, curpl, maxpl, scoret, scorect) VALUES ('%s', 

'%s', '%s', '%s', '%d', '%d', '%d', '%d') ", curmap, nextmap, timelimit, timeleft, curpl, maxpl, teamt, teamct)
    mk(query)
    first_update =true
}
else
{
    new Handle:query = SQL_PrepareQuery(sqlc, "UPDATE other SET curmap = '%s', nextmap = '%s', timelimit = '%s', timeleft = '%s', curpl = '%d', maxpl = 

'%d', scoret = '%d', scorect = '%d' ",curmap, nextmap, timelimit, timeleft, curpl, maxpl, teamt, teamct)
    mk(query)
}

Neveido jaunu Handle:query katru reizi, izveido vai nu global vai arī static, vai arī pirms if/else vienu.

19.

public update_details(teamct, teamt)

Kāpēc tu to vietā nevarētu izmantot globalos mainīgos, kas tev jau Ir?

20.

replace_all(pl_name, 55, "'", "'")

>

replace_all(pl_name, 55, "'", "\'")

MySQL viņš ieliks bez \.

21.

switch(num)
{
    case 0: 
    {
        new Handle:query = SQL_PrepareQuery(SqlC, "INSERT INTO players (pl_name, pl_ip, pl_frags, pl_death, pl_team, pl_admin) VALUES ('%s', '%s', 

'%d', '%d', '%s', '%s')", pl_name, pl_ip, frags, death, team, is_admin[id] == true ? "1" : "0")
        mk(query)
    }
    case 1:
    {
        new Handle:query = SQL_PrepareQuery(SqlC, "UPDATE players SET pl_name = '%s', pl_frags = '%d', pl_death = '%d', pl_team = '%s', pl_admin = 

'%s' WHERE pl_ip = '%s' ", pl_name, frags, death, team, is_admin[id] == true ? "1" : "0", pl_ip)
        mk(query)
    }
    case 2:
    {
        new Handle:query = SQL_PrepareQuery(SqlC, "DELETE FROM players WHERE pl_ip = '%s'", pl_ip)
        mk(query)
    }
}

Netaisi katru reizi jaunu, izmanto to pašu mainīgo, ko jau iepriekš ieteicu.

mk(query) iznes ārā no switch.

22.

create_table(sqlc, 1, "")
create_table(sqlc, 2, "")
create_table(sqlc, 3, "")
create_table(sqlc, 4, "")

ČO ZA FĀK?

>

Ņem piemēru no šī(iekļauti mainīgie un cits šits no punkta 3. Skatīt augstāk):

public DatabaseConnect() {
    
    new MySqlInfo[SQL_INFO][64], Query[5][192]
    
    get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:HOST],63)
    get_pcvar_string(c_MySqlInfo[SQL_INFO:USER],MySqlInfo[SQL_INFO:USER],63)
    get_pcvar_string(c_MySqlInfo[SQL_INFO:PASSWORD],MySqlInfo[SQL_INFO:PASSWORD],63)
    get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:DATABASE],63)
    
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
    
    SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511)

    if(SqlConnection == Empty_Handle) {
        
        log_amx(g_Error)
        
        return PLUGIN_CONTINUE
    }
    
    formatex(Query[0],255,"CREATE DATABASE IF NOT EXISTS %s",MySqlInfo[SQL_INFO:DATABASE]); SendQuery(g_Query)
    formatex(Query[1],255,"CREATE TABLE IF NOT EXISTS Players (PlayerName VARCHAR(64), PlayerFrags INT, PlayerDeaths INT, PlayerTeam VARCHAR(3))")
    formatex(Query[2],255,"CREATE TABLE IF NOT EXISTS Other (Map VARCHAR(33), NextMap VARCHAR(33), TimeLimit VARCHAR(6), TimeLeft VARCHAR(6), TScore 

INT, CTScore INT, PlayerCount, MaxPlayers)")
    
    formatex(Query[3],255,"DELETE * FROM Players")
    formatex(Query[4],255,"DELETE * FROM Other")
    
    SendMultipleQueries(Query,5)
}

public SendMultipleQueries(Queries[][],Count) {
    
    new i
    
    for(i = 0; i < Count; i++) {
        
        SendQuery(Queries[i])
    }
}

public SendQuery(Query1[]) {
    
    SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511)
    
    if(g_SqlTuple != Empty_Handle) {
        
        static Handle:Query
        
        Query = SQL_PrepareQuery(SqlConnection,Query1)
        
        if(!SQL_Execute(Query)) {
            
            SQL_QueryError(Query,g_Error,511)
            
            log_amx(g_Error)
        }
        
        SQL_FreeHandle(Query)
        SQL_FreeHandle(SqlConnection)
    }
    else {
        
        log_amx(g_Error)
    }
}

UN punkts nummur divdesmit trīs:

public plugin_end() SQL_FreeHandle(tuple)

Tā vajag? Kur tu rāvi, ka tā vajag darīt? Kāpēc tu to dari? Pastāsti, kur tu izlasīji, ka tā vajag darīt?! Godīgi sakot, nedomāju, ka tā vajag, bet parādi, kur tu izlasīji, ka vajag, lūdzu.

P.S. Monitors ir OK. (thumbsup).

Edited by shine
Link to comment
Share on other sites

Es nerakstīšu neko gari, bet:

maxpl = get_maxplayers()

Vai tad maxplayers var mainīties spēles laikā? Nē.. uztaisi global maxpl = get_maxplayers() vienu reizi kodā.

un

public update_details(score_teamct, score_teamt)

>

public update_details()

and

Smuki.. ir atstarpes starp funkcijām, vēl kodā ieliec atstarpes starp visiem IF un pēc mainīgo izveidošanas. Tā jau kods salasāmāks. Congratz. Izmēģini likt { } arī, ja pēc nosacījuma( if(blablabla = 2312) ) ir tikai viena darbība. Izskatās daudz smukāk un tiešām vieglāk salasīt. +Ja gribi, lai plugins izskatās garāks.. >

public    client_disconnect(id) {
    if(!using_sql) update_player(id, 2)
    else set_task(2.0, "client_disconnect", id)
}

>

public    client_disconnect(id) {
    
    if(!using_sql) {
        
        update_player(id, 2)
    }
    else {
        
        set_task(2.0, "client_disconnect", id)
    }
}

Pie pārējiem sīkumiem nepiesiešos.. karoče neskatīšos vairāk kodu tik sīki. Vismaz viens skripteris māk kaut ko uztaisīt Latvijā :).

Edited by shine
Link to comment
Share on other sites

:) .

Nu ja :) tas ir labi, ka tu dzivo Krievija :D

+ būtu tomēr labāk ja arī db tu šeit ieliktu

nesapratu... kadu db? tip install.php ?

btw. shine... veidojam weblapu, tip Latvian amxx :D :D :D tas ir labak neka tos pluginus katru nedelju... :D

Link to comment
Share on other sites

:) tas ir labi, ka tu dzivo Krievija :D

nesapratu... kadu db? tip install.php ?

btw. shine... veidojam weblapu, tip Latvian amxx :D :D :D tas ir labak neka tos pluginus katru nedelju... :D

tabulas other un players saturu :) ko kopēt iekš phpmyadmin :)

Link to comment
Share on other sites

Ok, tu maksā par hostu un domēnu :D. Un nekādu ucoz vai oo.lv! Da tas būs fails, neviens tāpat nemāk un nevēlas iemācīties kodē AMXX-Pawn valodā.. Latvijā.

Tu nevienu pluginu ar mani nevari uztaisīt, un kur tu nu vēl pats publicēt, tāpēc tevi nepazīst allied modders. Skatos gign esi populārs skripteris :D. Davai uzmeiko kādu ūber krutu pluginu un publicē allied modders. Iemetīšu kādu labu vārdu! Vai arī uztaisam kaut ko kopā... tev pat grūti ieslēgt TViewer un ielaist paskatīties <_<...

Edited by shine
Link to comment
Share on other sites

MySQL CODE -> http://yy.lv/download.php?f=51335 или

=====================================

CREATE TABLE `other` (

`curmap` varchar(255) NOT NULL,

`nextmap` varchar(255) NOT NULL,

`timelimit` varchar(255) NOT NULL,

`timeleft` varchar(255) NOT NULL,

`scoret` varchar(255) NOT NULL,

`scorect` varchar(255) NOT NULL,

`curpl` varchar(255) NOT NULL,

`maxpl` varchar(255) NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `players` (

`pl_name` varchar(255) NOT NULL,

`pl_frags` varchar(255) NOT NULL,

`pl_death` varchar(255) NOT NULL,

`pl_team` varchar(255) NOT NULL,

`pl_ip` varchar(255) NOT NULL,

`pl_admin` varchar(255) NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

=====================================

Можно так `pl_admin` varchar(255) NOT NULL и так `pl_admin` INT(255) NOT NULL

Edited by Lancom
Link to comment
Share on other sites

:) ko kopēt iekš phpmyadmin :)

Ja es pateikshu, ka tabulas un saturu plugins (amxx) uztaisa pats, tad tev vajadziba pec koda pazudis?

Ja ne, tad varu ielikt, bet itka Lancom'a?kods ir diezgan normals... cik atceros pl_admin bija nevis varchar, bet int, bet es nezinu, vai tas ko maina :)

Tu nevienu pluginu ar mani nevari uztaisīt, un kur tu nu vēl pats publicēt, tāpēc tevi nepazīst allied modders.

Es nepubliceju nevienu pluginu amxx'a, jo man nav vajadzibas to darit... turklat, ja es iepostošu, tad uzreiz birsies tie tur ieteikumi/uzlabojumi... ja tu vari sedet pie skiptoshanas 24/7, tad es ne... man tas sak apnikt :D

Link to comment
Share on other sites

for(new i = 0; i < 33; i++)

i = 0 līdz i = 32, jo vienmēr ir mazāks par 33. Tas pats ar stringiem sākas no 0 un iet līdz n - 1.

rmx, netaisi neko ūberīgu, pirmstam ar mani parunā un es tev norādīšu kļūdas. Viņi man vairs nepiesienas :D. Vismaz vienu pluginu publicē, tici man būsi kruts, ka vismaz 1 tavs darbs būs amxmodx.org.

Or uztaisam kaut ko kopā, vienam nav jautri :/.

Link to comment
Share on other sites

  • 2 weeks later...
  • 4 weeks later...

Man rāda šādi:

Mapname: cs_assault

Nextmap: de_cbble

Players: 16/22

Timelimit: 30

Timeleft: 25

Score: Ct 0 Ts 3

Players Frags Deaths

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

CTs

Ts

gyvulelis 1 3

Ts

faiL 3 2

Ts

XeqtR` RokkY 1 1

Ts

Ts

Ts

cool som fan 1 2

Ts

Killa_No1 2 2

Ts

Ts

Ts

Ts

Ts

robban lover! 6 1

Ts

Ts

Kiler$$ 0 1

Ts

- [DecauX;]# sUpEr_mArIo 0 0

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Spectators

Edited by Grow3r
Link to comment
Share on other sites

  • 2 weeks later...

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
 Share

×
×
  • Create New...