Иконка ресурса

dPI Game 1.2 - 1.4.1

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #1
dPI Game

Статус:
CSGO ; CSS | v1.4.1 | by Primo

Описание:

Добавляет на сервер простую систему, которая подобна GunGame. Отличием от обычного GunGame является то, что игрок должен повышать уровень, зарабатывая опыт за убийства, чтобы открыть новое оружие. На сервере будет вестись личная статистика игрока.

Каждое требуемое кол-во опыта для повышения уровня вычисляется по формуле:Level*200
Получаемый опыт за убийство вычисляется по формуле: HealthAttacker*LevelVictim/10

Все данные сохраняются в базу SQLite. Поддержки MySQL нет!
Команд в данной версии нет, как и кваров. Это лишь сырая версия.
Исходник легко изменяемый, нет замудрённых функций и т.п.

Установка:
Скомпилируйте плагин.
Открываем addons/sourcemod/plugins/ кидаем туда скомпилированный dpInfo.smx
Открываем addons/sourcemod/configs/databases.cfg и добавляем туда
PHP:
"dpInfo"
    {
        "driver"    "sqlite"
        "database"  "dpInfo"
    }
Перезагрузить сервер и играть.

Примечание:
Редактируйте исходник. В нём указана вся реклама и текст.
Не убирайте копирайты из исходника, они вам ничем не помешают, уважайте чужой труд.

Увидеть плагин в действии можно на сервере 91.238.227.122:27218

Плагин тестируется на SourceMod 1.5.3

История версий:

Версия 1.4


* При спавне удаляется оружие
* Подсчитывается кол-во убийств ботов
* За ботов не дают никакой награды
* Требуемый опыт изменён с 1500 на 200

Версия 1.3

* Добавлен native
PHP:
//Запускает проверку уровня
native CheckLvlGun(client);
* Добавлено меню выбора доступного оружия, вызываемое при спавне.
Версия 1.2
*Добавлены Natives:
PHP:
// Получает уровень игрока
native pGetPlayerLevel(client);

//Получает опыт игрока
native pGetPlayerEXP(client);

//Устанавливает уровень игрока
native pSetPlayerLevel(client, num1);

//Устанавливает опыт игрока
native pSetPlayerEXP(client, num1);

//Выводит статистику игрока в чат
native pViewStatistic(client);

//Получает кол-во кредитов игрока
native pGetPlayerCredits(client);

//Устанавливает кредиты игроку
native pSetPlayerCredits(client, num1);

//Получает кол-во убийств игрока
native pGetPlayerKills(client);

//Устанавливает кол-во убийств игрока
native pSetPlayerKills(client, num1);

//Получает кол-во смертей игрока
native pGetPlayerDeaths(client);

//Устанавливает кол-во смертей игрока
native pSetPlayerDeaths(client, num1);

//Получает кол-во серии убийств
native pGetPlayerKillStreak(client);

//Устанавливает кол-во серии убийств
native pSetPlayerKillStreak(client, num1);

Версия 1.1
* Улучшен код.
* Добавлена серия убийств
* За убийство в голову дают дополнительные 50 опыта
* За убийство серийного убийцы дают опыт, расчитываемый по формуле: LevelVictim*KillStreakVictim
* В статистику выводится ваша серия в данный момент
 
Последнее редактирование модератором:

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #2
Re: [CSGO] dPI Game v1.0

В данный момент это сырой плагин, который выставлен на всеобщее обозрение для оценки.
 

fallen1994

Участник
Сообщения
2,357
Реакции
538
Re: [CSGO] dPI Game v1.0

я так и не понял суть этого плагина. Может для идеи, добавить некие преимущества за уровни?
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #4
Re: [CSGO] dPI Game v1.0

Преимуществом будет самое оружие, как и в GunGame, с каждым новым уровнем выдаётся оружие лучшее предыдущего.
Но никто не запрещает добавить в плагин еще какие-либо преимущества.
Я хочу за очки сделать что-то типа магазина, т.к. очки в данный момент никак не задействованы.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
Re: [CSGO] dPI Game v1.0

Primo, выводи нативы и форварды. Тогда к этому плагину можно будет дописать много интересного.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #6
Re: [CSGO] dPI Game v1.0

Primo, выводи нативы и форварды. Тогда к этому плагину можно будет дописать много интересного.

Я бы с радостью, да вот не получается) Сколько не пытался на amxx раньше, что в sm, не могу) Попробую вывести, если получится конечно.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
Re: [CSGO] dPI Game v1.0

Primo, пиши в скайп, помогу.

А теперь по плагину:
1.
PHP:
//-------- 
//-------- Выдача оружия по уровню
public CheckLvlGun(client)
{
	if(Player[pLevel][client] == 1)
	{
		GivePlayerItem(client, "weapon_glock", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} Glock");
	}
	if(Player[pLevel][client] == 2)
	{
		GivePlayerItem(client, "weapon_p250", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} P250");
	}
	if(Player[pLevel][client] == 3)
	{
		GivePlayerItem(client, "weapon_fiveseven", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} FiveSeven");
	}
	if(Player[pLevel][client] == 4)
	{
		GivePlayerItem(client, "weapon_deagle", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} Deagle");
	}
	if(Player[pLevel][client] == 5)
	{
		GivePlayerItem(client, "weapon_elite", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} Elite");
	}
	if(Player[pLevel][client] == 6)
	{
		GivePlayerItem(client, "weapon_hkp2000", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} hkp2000");
	}
	if(Player[pLevel][client] == 7)
	{
		GivePlayerItem(client, "weapon_nova", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} Nova");
	}
	if(Player[pLevel][client] == 8)
	{
		GivePlayerItem(client, "weapon_xm1014", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} xm1014");
	}
	if(Player[pLevel][client] == 9)
	{
		GivePlayerItem(client, "weapon_mag7", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} mag7");
	}
	if(Player[pLevel][client] == 10)
	{
		GivePlayerItem(client, "weapon_sawedoff", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} Sawedoff");
	}
	if(Player[pLevel][client] == 11)
	{
		GivePlayerItem(client, "weapon_m249", 0);
		CPrintToChat(client, "{lightgreen}Вы получили оружие{green} m249");
	}
}
//--------

Тут лучше сделать так:
PHP:
switch(Player[pLevel][client])
	{
		case 1:
		{
			GivePlayerItem(client, "weapon_glock", 0);
			CPrintToChat(client, "{lightgreen}Вы получили оружие{green} Glock");
		}
		case 2:
		{
			GivePlayerItem(client, "weapon_p250", 0);
			CPrintToChat(client, "{lightgreen}Вы получили оружие{green} P250");
		}
		case 3:
		{
			GivePlayerItem(client, "weapon_fiveseven", 0);
			CPrintToChat(client, "{lightgreen}Вы получили оружие{green} FiveSeven");
		}
		// и так далее
	}
А еще лучше так:
PHP:
new String:g_sWeapons [количество оружий][] = {"glock", "p250", "fiveseven", "deagle", "elite" ...};

stock CheckLvlGun(client)
{
	decl String:sWeapon[32];
	FormatEx(sWeapon, sizeof(sWeapon), "weapon_", g_sWeapons[Player[pLevel][client]+1]);
	GivePlayerItem(client, sWeapon);
	CPrintToChat(client, "{lightgreen}Вы получили оружие{green} %s", g_sWeapons[Player[pLevel][client]+1]);
}
2.
PHP:
enum PlayerInfo
{
	pLevel,
	pEXP,
	pCredit,
	pKills,
	pDeaths,
}

new Player[PlayerInfo][MAXPLAYERS];
Почему так, а не так?
PHP:
new Player[MAXPLAYERS+1][PlayerInfo];
P.S. Еще +1 забыл =)
3.
description = "Плагин сохраняется вашу статистику. За каждый новый уровень дают новое оружие."
4.
PHP:
for (new client=1; client<=GetMaxClients(); client++)
	{
		ViewStatistic(client);
	}
Нет проверки в игре ли игрок.
PHP:
for (new client=1; client <= MaxClients; client++)
	{
		if(IsClientInGame(client)) ViewStatistic(client);
	}
5.
PHP:
SELECT * FROM `users` WHERE `Steam` = '%s';
Зачем выбирать все если ты юзаешь не все.
PHP:
Player[pKills][iClient] = SQL_FetchInt(hndl, 2);
			Player[pDeaths][iClient] = SQL_FetchInt(hndl, 3);
			Player[pLevel][iClient] = SQL_FetchInt(hndl, 4);
			Player[pEXP][iClient] = SQL_FetchInt(hndl, 5);
			Player[pCredit][iClient] = SQL_FetchInt(hndl, 6);
6.
PHP:
public OnClientDisconnect(client)
{
	decl String:sAuth[32];
	GetClientAuthString(client, sAuth, sizeof(sAuth) - 1);
	if(0 < client <= MaxClients && !IsFakeClient(client))
	{

		decl String:sName[256], String:query[256];
		GetClientName(client, pName, 256);
		Format(query, sizeof(query), "INSERT OR REPLACE INTO users('Steam', 'Nick', 'Kills', 'Deaths', 'Level', 'EXP', 'Credits') VALUES ('%s', '%s', %d, %d, %d, %d, %d);", sAuth, pName, Player[pKills][client], Player[pDeaths][client], Player[pLevel][client], Player[pEXP][client], Player[pCredit][client]);
		SQL_TQuery(db, SQL_SelectPlayerCallback, query, 0);
	}
}
Ты не знаешь бот это или нет, а уже получаешь стим.
Должно быть так:
PHP:
public OnClientDisconnect(client)
{
	if(!IsFakeClient(client))
	{
		decl String:sName[32], String:sAuth[32];
		if(GetClientName(client, sName, 256) && GetClientAuthString(client, sAuth, sizeof(sAuth) - 1))
		{
			decl String:query[256];
			Format(query, sizeof(query), "INSERT OR REPLACE INTO users('Steam', 'Nick', 'Kills', 'Deaths', 'Level', 'EXP', 'Credits') VALUES ('%s', '%s', %d, %d, %d, %d, %d);", sAuth, pName, Player[pKills][client], Player[pDeaths][client], Player[pLevel][client], Player[pEXP][client], Player[pCredit][client]);
			SQL_TQuery(db, SQL_SelectPlayerCallback, query, 0);
		}
	}
}
7.
PHP:
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(!IsFakeClient(client))
	{
		if(IsClientInGame(client))
		{
			FakeClientCommand(client, "drop"); 
			if(Player[pLevel][client] == 0)
				Player[pLevel][client]++;
			ViewStatistic(client);
			CheckLevel(client);
		}
	}
}
Не знаю как на ксго, но на ксс player_spawn вызывается еще и при входе игрока.
И еще проверка в игре ли игрок идет после проверки на бота. Должно быть наоборот.
PHP:
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsClientInGame(client) && !IsFakeClient(client) && IsPlayerAlive(client))
	{
		FakeClientCommand(client, "drop"); 
		if(Player[pLevel][client] == 0) Player[pLevel][client]++;
		ViewStatistic(client);
		CheckLevel(client);
	}
}
8.
PHP:
public VErtoe_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	new victim = GetClientOfUserId(GetEventInt(event, "userid"));
	new health = GetClientHealth(attacker);
	new nLVLxp;
	if(!IsFakeClient(attacker) || !IsFakeClient(victim))
	{
		if(IsClientInGame(attacker) || IsClientInGame(victim))
		{
			nLVLxp = health*Player[pLevel][victim]/10
			nLVLxp = nLVLxp+Player[pEXP][attacker]
			Player[pKills][attacker]++;
			Player[pDeaths][victim]++;
			Player[pEXP][attacker] = nLVLxp
			Player[pCredit][attacker]++;
			ViewStatistic(attacker);
		}
	}
}
Тут ошибок может насыпать ибо убить игрока может мир (индекс 0).
PHP:
new health = GetClientHealth(attacker);
new nLVLxp;
Создавай переменные уже после всех проверок. Да и то есть они нужны.
PHP:
public VErtoe_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	new victim = GetClientOfUserId(GetEventInt(event, "userid"));
	
	if(attacker > 0 && victim > 0 && IsClientInGame(attacker) && IsClientInGame(victim) && !IsFakeClient(attacker) && !IsFakeClient(victim))
	{
		new nLVLxp = GetClientHealth(attacker)*Player[pLevel][victim]/10
		nLVLxp = nLVLxp+Player[pEXP][attacker]
		Player[pKills][attacker]++;
		Player[pDeaths][victim]++;
		Player[pEXP][attacker] = nLVLxp
		Player[pCredit][attacker]++;
		ViewStatistic(attacker);
	}
}

Пока хватит.
 
Последнее редактирование:

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #8
Re: [CSGO] dPI Game v1.0

2. Я писал на обычном pawn для samp и там использовался Player[PlayerInfo][MAXPLAYERS], поэтому я привык уже
3. Загнался, когда печатал)
5. Оставлю так
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #9
Re: [CSGO] dPI Game v1.0

Версия 1.1

* Улучшен код.
* Добавлена серия убийств
* За убийство в голову дают дополнительные 50 опыта
* За убийство серийного убийцы дают опыт, расчитываемый по формуле: LevelVictim*KillStreakVictim
* В статистику выводится ваша серия в данный момент
 
Последнее редактирование модератором:

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #10
Re: [CSGO] dPI Game v1.1

Версия 1.2

*Добавлены Natives:

PHP:
// Получает уровень игрока
native pGetPlayerLevel(client);

//Получает опыт игрока
native pGetPlayerEXP(client);

//Устанавливает уровень игрока
native pSetPlayerLevel(client, num1);

//Устанавливает опыт игрока
native pSetPlayerEXP(client, num1);

//Выводит статистику игрока в чат
native pViewStatistic(client);

//Получает кол-во кредитов игрока
native pGetPlayerCredits(client);

//Устанавливает кредиты игроку
native pSetPlayerCredits(client, num1);

//Получает кол-во убийств игрока
native pGetPlayerKills(client);

//Устанавливает кол-во убийств игрока
native pSetPlayerKills(client, num1);

//Получает кол-во смертей игрока
native pGetPlayerDeaths(client);

//Устанавливает кол-во смертей игрока
native pSetPlayerDeaths(client, num1);

//Получает кол-во серии убийств
native pGetPlayerKillStreak(client);

//Устанавливает кол-во серии убийств
native pSetPlayerKillStreak(client, num1);
 
Последнее редактирование модератором:

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #11
Re: [CSGO] dPI Game v1.3

Версия 1.3


* Добавлен native
PHP:
//Запускает проверку уровня
native CheckLvlGun(client);
* Добавлено меню выбора доступного оружия, вызываемое при спавне.
 
Последнее редактирование модератором:

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #12
Re: [CSGO] dPI Game v1.3

В последних версиях не используются очки, нужно их как-то задействовать. Если у кого-то есть предложения, пишите, буду только рад.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #13
Re: [CSGO] dPI Game v1.4

Выкладываю последнюю на данный момент версию, давно не редактировал плагин)

Версия 1.4

* При спавне удаляется оружие
* Подсчитывается кол-во убийств ботов
* За ботов не дают никакой награды
* Требуемый опыт изменён с 1500 на 200
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #14
Re: [CSGO] dPI Game v1.4

Primo,
PHP:
static Handle:db;
Здесь можно просто new.

PHP:
public VErtoe_Smoke(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	new Float:x = GetEventFloat(event, "x");
	new Float:y = GetEventFloat(event, "y");
	new Float:z = GetEventFloat(event, "z");
	new Float:Origin[3];
	Origin[0] = x;
	Origin[1] = y;
	Origin[2] = z;
	TeleportEntity(client, Origin, NULL_VECTOR, NULL_VECTOR);
}

Зачем создавать столько переменных?

PHP:
public VErtoe_Smoke(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid")),
		Float:Origin[3];

	Origin[0] = GetEventFloat(event, "x");
	Origin[1] = GetEventFloat(event, "y");
	Origin[2] = GetEventFloat(event, "z");
	TeleportEntity(client, Origin, NULL_VECTOR, NULL_VECTOR);
}

PHP:
public OnClientDisconnect(client)
{
    if(!IsFakeClient(client))
    {
		decl String:sAuth[32];
		GetClientAuthString(client, sAuth, sizeof(sAuth) - 1);
		if(0 < client <= MaxClients && !IsFakeClient(client))
		{

			new String:pName[256];
			GetClientName(client, pName, 256);
			decl String:query[256];
			Format(query, sizeof(query), "INSERT OR REPLACE INTO users('Steam', 'Nick', 'Kills', 'Deaths', 'Level', 'EXP', 'Credits', 'BotKills') VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d);", sAuth, pName, Player[pKills][client], Player[pDeaths][client], Player[pLevel][client], Player[pEXP][client], Player[pCredit][client], Player[pBotKills][client]);
			SQL_TQuery(db, SQL_SelectPlayerCallback, query, 0);
		}
	}
}
Много лишних действий.
С именем игрока нужно делать SQL_EscapeString
new String:pName[256]; Зачем так много ?
decl String:query[256]; А здесь мало будет.

PHP:
public OnClientDisconnect(client)
{
	if(0 < client <= MaxClients && !IsFakeClient(client))
	{
		decl String:sAuth[64], String:pName[150], String:query[512];
		GetClientName(client, sAuth, sizeof(sAuth) - 1);
		SQL_EscapeString(db, sAuth, pName, sizeof(pName) - 1);
		GetClientAuthString(client, sAuth, sizeof(sAuth) - 1);
		FormatEx(query, sizeof(query), "INSERT OR REPLACE INTO users('Steam', 'Nick', 'Kills', 'Deaths', 'Level', 'EXP', 'Credits', 'BotKills') VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d);", sAuth, pName, Player[pKills][client], Player[pDeaths][client], Player[pLevel][client], Player[pEXP][client], Player[pCredit][client], Player[pBotKills][client]);
		SQL_TQuery(db, SQL_SelectPlayerCallback, query);
	}
}

PHP:
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsClientInGame(client) && !IsFakeClient(client))
	{

Проверяй IsPlayerAlive

PHP:
public VErtoe_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	new victim = GetClientOfUserId(GetEventInt(event, "userid"));
	new headshot = GetClientOfUserId(GetEventInt(event, "headshot"));
	if(attacker > 0 && victim > 0)
	{
		if(IsClientInGame(attacker) && IsClientInGame(victim))
		{
			if(IsFakeClient(victim))
			{
				Player[pBotKills][attacker]++;
			}
			if(!IsFakeClient(attacker) && !IsFakeClient(victim))
			{
				new nLVLxp = GetClientHealth(attacker)*Player[pLevel][victim]/10
				nLVLxp = nLVLxp+Player[pEXP][attacker]
				Player[pKills][attacker]++;
				Player[pDeaths][victim]++;
				Player[pEXP][attacker] = nLVLxp
				Player[pCredit][attacker]++;
				Player[pKillStreak][attacker]++;
				Player[pKillStreak][victim] = 0
				if(Player[pKillStreak][victim] > 0)
				{
					new nLVLxp2 = Player[pLevel][victim]*Player[pKillStreak][victim];
					Player[pEXP][attacker] = Player[pEXP][attacker]+nLVLxp2
					PrintToChat(attacker, "Вы получили дополнительно \x01\x04%d \x01\x05опыта за убившего \x01\x04\%d \x01\x05людей", nLVLxp2, Player[pKillStreak][victim]);
				}
				if(headshot)
				{
					Player[pEXP][attacker] = Player[pEXP][attacker]+50;
					PrintToChat(attacker, "Вы получили \x01\x04 50\x01\x05 опыта за убийство в голову");
				}
				ViewStatistic(attacker);
			}
		}
    }
}

Что за бред вот тут?
PHP:
new headshot = GetClientOfUserId(GetEventInt(event, "headshot"));
"headshot" Это буловое значение. Почему инт? Зачем получать индекс клиента из хедшота?? Шта???

К тому же создаешь переменные перед проверками, делай после них.

Вот так:

PHP:
public VErtoe_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker")),
		victim = GetClientOfUserId(GetEventInt(event, "userid"));
	if(attacker > 0 && IsClientInGame(attacker) && victim > 0 && IsClientInGame(victim))
	{
		if(IsFakeClient(victim)) Player[pBotKills][attacker]++;
		if(!IsFakeClient(attacker) && !IsFakeClient(victim))
		{
			new nLVLxp = GetClientHealth(attacker)*Player[pLevel][victim]/10;
			nLVLxp = nLVLxp+Player[pEXP][attacker];
			Player[pKills][attacker]++;
			Player[pDeaths][victim]++;
			Player[pEXP][attacker] = nLVLxp;
			Player[pCredit][attacker]++;
			Player[pKillStreak][attacker]++;
			Player[pKillStreak][victim] = 0;
			if(Player[pKillStreak][victim] > 0)
			{
				new nLVLxp2 = Player[pLevel][victim]*Player[pKillStreak][victim];
				Player[pEXP][attacker] = Player[pEXP][attacker]+nLVLxp2
				PrintToChat(attacker, "Вы получили дополнительно \x01\x04%d \x01\x05опыта за убившего \x01\x04\%d \x01\x05людей", nLVLxp2, Player[pKillStreak][victim]);
			}
			if(GetEventBool(event, "headshot"))
			{
				Player[pEXP][attacker] = Player[pEXP][attacker]+50;
				PrintToChat(attacker, "Вы получили \x01\x04 50\x01\x05 опыта за убийство в голову");
			}
			ViewStatistic(attacker);
		}
    }
}

Далее там с оружием.
Лучше хранить все названия и имена оружий в глобальном массиве строк и юзать индексы. Удобнее будет.

:acute:
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #15
Re: [CSGO] dPI Game v1.4

Primo,
PHP:
static Handle:db;
Здесь можно просто new.

PHP:
public VErtoe_Smoke(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	new Float:x = GetEventFloat(event, "x");
	new Float:y = GetEventFloat(event, "y");
	new Float:z = GetEventFloat(event, "z");
	new Float:Origin[3];
	Origin[0] = x;
	Origin[1] = y;
	Origin[2] = z;
	TeleportEntity(client, Origin, NULL_VECTOR, NULL_VECTOR);
}

Зачем создавать столько переменных?

PHP:
public VErtoe_Smoke(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid")),
		Float:Origin[3];

	Origin[0] = GetEventFloat(event, "x");
	Origin[1] = GetEventFloat(event, "y");
	Origin[2] = GetEventFloat(event, "z");
	TeleportEntity(client, Origin, NULL_VECTOR, NULL_VECTOR);
}

PHP:
public OnClientDisconnect(client)
{
    if(!IsFakeClient(client))
    {
		decl String:sAuth[32];
		GetClientAuthString(client, sAuth, sizeof(sAuth) - 1);
		if(0 < client <= MaxClients && !IsFakeClient(client))
		{

			new String:pName[256];
			GetClientName(client, pName, 256);
			decl String:query[256];
			Format(query, sizeof(query), "INSERT OR REPLACE INTO users('Steam', 'Nick', 'Kills', 'Deaths', 'Level', 'EXP', 'Credits', 'BotKills') VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d);", sAuth, pName, Player[pKills][client], Player[pDeaths][client], Player[pLevel][client], Player[pEXP][client], Player[pCredit][client], Player[pBotKills][client]);
			SQL_TQuery(db, SQL_SelectPlayerCallback, query, 0);
		}
	}
}
Много лишних действий.
С именем игрока нужно делать SQL_EscapeString
new String:pName[256]; Зачем так много ?
decl String:query[256]; А здесь мало будет.

PHP:
public OnClientDisconnect(client)
{
	if(0 < client <= MaxClients && !IsFakeClient(client))
	{
		decl String:sAuth[64], String:pName[150], String:query[512];
		GetClientName(client, sAuth, sizeof(sAuth) - 1);
		SQL_EscapeString(db, sAuth, pName, sizeof(pName) - 1);
		GetClientAuthString(client, sAuth, sizeof(sAuth) - 1);
		FormatEx(query, sizeof(query), "INSERT OR REPLACE INTO users('Steam', 'Nick', 'Kills', 'Deaths', 'Level', 'EXP', 'Credits', 'BotKills') VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d);", sAuth, pName, Player[pKills][client], Player[pDeaths][client], Player[pLevel][client], Player[pEXP][client], Player[pCredit][client], Player[pBotKills][client]);
		SQL_TQuery(db, SQL_SelectPlayerCallback, query);
	}
}

PHP:
public VErtoe_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) 
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if(IsClientInGame(client) && !IsFakeClient(client))
	{

Проверяй IsPlayerAlive

PHP:
public VErtoe_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	new victim = GetClientOfUserId(GetEventInt(event, "userid"));
	new headshot = GetClientOfUserId(GetEventInt(event, "headshot"));
	if(attacker > 0 && victim > 0)
	{
		if(IsClientInGame(attacker) && IsClientInGame(victim))
		{
			if(IsFakeClient(victim))
			{
				Player[pBotKills][attacker]++;
			}
			if(!IsFakeClient(attacker) && !IsFakeClient(victim))
			{
				new nLVLxp = GetClientHealth(attacker)*Player[pLevel][victim]/10
				nLVLxp = nLVLxp+Player[pEXP][attacker]
				Player[pKills][attacker]++;
				Player[pDeaths][victim]++;
				Player[pEXP][attacker] = nLVLxp
				Player[pCredit][attacker]++;
				Player[pKillStreak][attacker]++;
				Player[pKillStreak][victim] = 0
				if(Player[pKillStreak][victim] > 0)
				{
					new nLVLxp2 = Player[pLevel][victim]*Player[pKillStreak][victim];
					Player[pEXP][attacker] = Player[pEXP][attacker]+nLVLxp2
					PrintToChat(attacker, "Вы получили дополнительно \x01\x04%d \x01\x05опыта за убившего \x01\x04\%d \x01\x05людей", nLVLxp2, Player[pKillStreak][victim]);
				}
				if(headshot)
				{
					Player[pEXP][attacker] = Player[pEXP][attacker]+50;
					PrintToChat(attacker, "Вы получили \x01\x04 50\x01\x05 опыта за убийство в голову");
				}
				ViewStatistic(attacker);
			}
		}
    }
}

Что за бред вот тут?
PHP:
new headshot = GetClientOfUserId(GetEventInt(event, "headshot"));
"headshot" Это буловое значение. Почему инт? Зачем получать индекс клиента из хедшота?? Шта???

К тому же создаешь переменные перед проверками, делай после них.

Вот так:

PHP:
public VErtoe_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker")),
		victim = GetClientOfUserId(GetEventInt(event, "userid"));
	if(attacker > 0 && IsClientInGame(attacker) && victim > 0 && IsClientInGame(victim))
	{
		if(IsFakeClient(victim)) Player[pBotKills][attacker]++;
		if(!IsFakeClient(attacker) && !IsFakeClient(victim))
		{
			new nLVLxp = GetClientHealth(attacker)*Player[pLevel][victim]/10;
			nLVLxp = nLVLxp+Player[pEXP][attacker];
			Player[pKills][attacker]++;
			Player[pDeaths][victim]++;
			Player[pEXP][attacker] = nLVLxp;
			Player[pCredit][attacker]++;
			Player[pKillStreak][attacker]++;
			Player[pKillStreak][victim] = 0;
			if(Player[pKillStreak][victim] > 0)
			{
				new nLVLxp2 = Player[pLevel][victim]*Player[pKillStreak][victim];
				Player[pEXP][attacker] = Player[pEXP][attacker]+nLVLxp2
				PrintToChat(attacker, "Вы получили дополнительно \x01\x04%d \x01\x05опыта за убившего \x01\x04\%d \x01\x05людей", nLVLxp2, Player[pKillStreak][victim]);
			}
			if(GetEventBool(event, "headshot"))
			{
				Player[pEXP][attacker] = Player[pEXP][attacker]+50;
				PrintToChat(attacker, "Вы получили \x01\x04 50\x01\x05 опыта за убийство в голову");
			}
			ViewStatistic(attacker);
		}
    }
}

Далее там с оружием.
Лучше хранить все названия и имена оружий в глобальном массиве строк и юзать индексы. Удобнее будет.

:acute:

Спасибо за обращенное внимание на код, но некоторые моменты я всё-таки пропущу.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #16
Re: [CSGO] dPI Game v1.4

Primo, На твоем месте я бы учел все замечания (особенно последних 3). Ибо они критические.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
  • Автор ресурса
  • #17
Re: [CSGO] dPI Game v1.4

Primo, На твоем месте я бы учел все замечания (особенно последних 3). Ибо они критические.

В SQL функции вы используете переменную sAuth, в которую сначала записываете ник персонажа, потом передаёте данные функцией SQL_EscapeString переменной pName. После этой операции вы записываете steamid в переменную sAuth, я правильно понял ваш предложенный алгоритм?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #18
Re: [CSGO] dPI Game v1.4

Primo, Зачем создавать лишнюю переменную если можна сделать так?
 

TolikCorp

Участник
Сообщения
874
Реакции
334
Re: [CSGO] dPI Game v1.4

Смоком можно залететь за пределы карты.
 

Похожие темы

Сверху Снизу