CS1.BG | DUST2 NOSHTA GARMI [RANKED PLAY] #1
45.144.155.113:27015
de_dust2
Играчи: 30/32
de_dust2
Cs-PlovdiV.com - Aim Attack 93.123.16.4:27022 aim_aztec Играчи: 0/16
★ [ALFA-GAME.NET] # WAR3FT [16]RACES [25]LVL [4]SHOPMENUS [GOLD menu] UNIQUE MODE SAVEXP CSDM★ 45.144.155.168:27017 cs_italy Играчи: 20/28

[RELEASE] Call admin SQL for SM

Помощ и уроци свързани със SourceMod скриптирането.
Аватар
pok4
Извън линия
Потребител
Потребител
Мнения: 160
Регистриран на: 05 Фев 2022, 14:38
Се отблагодари: 2 пъти
Получена благодарност: 74 пъти

[RELEASE] Call admin SQL for SM

Мнение от pok4 » 01 Ное 2023, 22:38

Хахаха.. Първи ли пиша пост тук ? Брей...
CS:GO залезе, а пък тук още няма тема.

Пускам безплатно плъгина който завърших за SourceMOD. Писан е със старата типизация и работи с calladmin уеб частта на Argos.
Ползва същата датабаза като на Call Admin системата за 1.6 сървърите на Nikolow, която е публикувана тук. Още повече - този плъгин вкарва всичко там - в същата таблица и така играчите ви могат да следят всички ваши сървъри на едно място.
Моята уеб част е ненадмината, тъй като работи с ajax бутон и обновява инфото динамично. Тук такава няма, а и няма да има (поне така мисля). Не ми беше лесно да я направя...


Давам кода не индентнат, ако ползвате някой туул - оправете си го. Може да се компилира успешно с warnings или да ползвате pragma там, която замаскира тези предупреждения, които не пречат на работата на плъгина.

Плъгина който споделям е скопен и липсват някои дефиниции като plugin author, version и т.н. (няма смисъл от тях). Автора съм аз :)

Код:

Код за потвърждение: Избери целия код

#pragma semicolon 1
#include <sourcemod>
new Handle:db;
new String:nickCache[33];
new String:clientCache;
new String:reasonCache[55];

public OnPluginStart() {

	LoadTranslations("common.phrases.txt");

	AddCommandListener(ChatTriggers, "say");
	AddCommandListener(ChatTriggers, "say_team");

	InitDB(db);
}
 
public Action:ChatTriggers(client, const String:command[], argc)
{
	decl String:cmd[256];
	GetCmdArgString(cmd, sizeof(cmd));

	if (StrContains(cmd, "!calladmin", false) != -1 || StrContains(cmd, "/calladmin", false) != -1)
	{
		//show the menu
		CallAdmin(client);
	}
	return Plugin_Continue;
}

public SQL_ErrorCheckCallBack(Handle:owner, Handle:hndl, const String:error[], any:data)
{
	if(hndl == INVALID_HANDLE)
	{
		SetFailState("Query failed! %s", error);
	}
}

InitDB(&Handle:DbHNDL)
{

	// Errormessage Buffer
	new String:Error[255];
	
	// COnnect to the DB
	DbHNDL = SQL_Connect("pok4_calladmin", true, Error, sizeof(Error));
	
	
	// If something fails we quit
	if(DbHNDL == INVALID_HANDLE)
	{
		SetFailState(Error);
	}
	
	// Querystring
	new String:Query[255];
	Format(Query, sizeof(Query), "CREATE TABLE IF NOT EXISTS `call_admin` (`id` INT(12) AUTO_INCREMENT PRIMARY KEY ,`nick` VARCHAR(30),`report` VARCHAR(255) ,`date` VARCHAR(10) ,`time` VARCHAR(10),`ip` VARCHAR(22),`server` VARCHAR(30),`ip2` VARCHAR(16),`reporter_name` VARCHAR(30));");
	
	// Database lock
	SQL_LockDatabase(DbHNDL);
	
	// Execute the query
	SQL_FastQuery(DbHNDL, Query);
	
	// Database unlock
	SQL_UnlockDatabase(DbHNDL);
	
}

// Function to add something to the DB
AddRecord(reporter_id)
{
	if(!IsValidClient(reporter_id)) {
		return;
	}
	// We could just write the query in the function but i like it that way
	new String:Query[255];
	new String:clientIP[32];
	new String:ReporterName[33];
	
	GetClientIP(reporter_id, clientIP, sizeof(clientIP));
	GetClientName(reporter_id, ReporterName, sizeof(ReporterName));
	
	new String:sTime[32];
	new String:sTime2[32];
	FormatTime(sTime, sizeof(sTime), "%H:%M:%S", GetTime()); 
	FormatTime(sTime2, sizeof(sTime2), "%d.%m.%Y", GetTime()); 
	//server name
	new Handle:convar = FindConVar("hostname");

	decl String:ServerName[64];
	GetConVarString( convar, ServerName, sizeof(ServerName)); 
	
	Format(Query, sizeof(Query), "INSERT INTO call_admin (nick,report,date,time,ip,server) VALUES ('%s','%s','%s','%s','%s','%s')", ReporterName,reasonCache,sTime2,sTime,clientIP,ServerName);
	
	// Send our Query to the Function

	SQL_TQuery(db, SQL_ErrorCheckCallBack, Query);
	
}

stock bool:IsValidClient(iClient) {
    return (iClient > 0 && iClient <= MaxClients);
}

public Action:CallAdmin(client)
{

        new String:clientName[50];
        new playerCount = 0;
        new index = 1;
		decl String:sID[24];
        playerCount = GetClientCount(true);
    
        new Handle:playerMenu = CreateMenu(Handle_PlayerSelect);
        SetMenuTitle(playerMenu, "Select Player to Report:");
    
        while (index <= playerCount)
        {
			if(IsClientConnected(index) && IsClientInGame(index) && GetUserAdmin(index) == INVALID_ADMIN_ID && !IsFakeClient(index))
			{
				Format(sID, sizeof(sID), "%d", GetClientSerial(index));

				GetClientName(index, clientName, sizeof(clientName));
				AddMenuItem(playerMenu,sID,clientName);
			}
			
			++index;
        }
        clientCache = client;
        DisplayMenu(playerMenu, client, 120);
            
        return Plugin_Handled;        
}

public Handle_PlayerSelect(Handle:playerMenu, MenuAction:action, param1, param2)
{

    if(action == MenuAction_Select)
    {    
	
		new String:sInfo[24];
		new iSerial;
		new iID;

		GetMenuItem(playerMenu, param2, sInfo, sizeof(sInfo));

		iSerial = StringToInt(sInfo);
		iID = GetClientFromSerial(iSerial);
		GetClientName(iID, nickCache, sizeof(nickCache));
		
		new Handle:CallAdmin_ = CreateMenu(Handle_CallAdmin_);
		
		SetMenuTitle(CallAdmin_, "Choose reason");
		AddMenuItem(CallAdmin_, "", "Hacker");
		AddMenuItem(CallAdmin_, "", "Bugger");
		AddMenuItem(CallAdmin_, "", "Abuser");
		AddMenuItem(CallAdmin_, "", "AFK");
		AddMenuItem(CallAdmin_, "", "Another");
		DisplayMenu(CallAdmin_,clientCache, 120);
    }
	else if(action == MenuAction_End)
    {
        CloseHandle(playerMenu);
    }    
}


public Handle_CallAdmin_(Handle:CallAdmin_, MenuAction:action, param1,  param2)
{
    if(action == MenuAction_Select)
    {
		new String:Playername[33];
		GetClientName(clientCache, Playername, sizeof(Playername));
		
 
		if(param2 == 0) {
			Format(reasonCache, sizeof(reasonCache), "%s is a Hacker",nickCache );
		}
		if(param2 == 1) {
			Format(reasonCache, sizeof(reasonCache), "%s is a Bugger",nickCache);
		}
		if(param2 == 2) {
			Format(reasonCache, sizeof(reasonCache), "%s is a Abuser",nickCache );
		}
		if(param2 == 3) {
			Format(reasonCache, sizeof(reasonCache), "%s is a AFK",nickCache);
		}
		if(param2 == 4) {
			Format(reasonCache, sizeof(reasonCache), "%s [Another reason]",nickCache);
		}
	   
		PrintToChatAll("%s povika admin, prichina: %s", Playername, reasonCache);
		AddRecord(clientCache);

    }
	else if(action == MenuAction_End)
    {
        CloseHandle(CallAdmin_);
    }   
}

Demo:


Плъгина е без поддръжка и надграждане, освен ако не си заплатите :)
Също така най-вероятно мога да подкарам и discord нотификейшъни към него, но както писах и в уеб турист(https://web-tourist.net/threads/argos-m ... ost-681701) - трудно ще ми е под CS Source v34.
Който иска и има сървъри на CS:GO и закупи всичко, можем да си поиграем да пригодим и нотификейшъните, тъй като не мога да компилирам плъгина със sm 1.6.4... (стара е версията). Успешно обаче компилирам горното парче код под 1.11.. :) Не вярвам да има проблеми в работата на плъгина под която и да е версия на SM.

CS:GO я има но-стийм, но няма да ми тръгне на лаптопа.. То CS Source едвам върви камоли пък CS:GO..
CS2 е ясно - още не може да се подкара SM на нея.. Когато подкарат всичко надявам се да имам вече по-нов лаптоп и да мога да си тествам на воля :)
Ай наздраве, пък каквото стане :hooray:

  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “SM Скриптиране”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта