Перейти к содержимому


Фотография

Admin Flag_kick

Flag_kick Admin Flag

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 15

#1 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 01 Февраль 2018 - 10:36

Привет парни! У меня следующий вопрос к вам.
Есть плагин который в начале карты выдаёт всем игрокам + БОТАМ оружие, таблетки, аптечки т.д и т.п.
Вопрос состоит в следующим, как в плагине прописать чтоб только Админ с флагом kick мог получать эти предметы?
Скрытый текст

Сообщение отредактировал Vitaliy_55ru: 01 Февраль 2018 - 10:40


#2 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 04 Февраль 2018 - 0:38

#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

bool block_give;

public void OnPluginStart()
{
	HookEvent("player_spawn", EventPlayerSpawn);
	HookEvent("round_start", Event_Round);
	HookEvent("round_end", Event_Round);
}

public void Event_Round(Event event, const char[] name, bool dontBroadcast)
{
	block_give = false;
}

public void EventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
	if (block_give)
	{
		int client = GetClientOfUserId(event.GetInt("userid"));
		AdminId AId = GetUserAdmin(client);
		int flags = GetAdminFlags(AId, Access_Effective);
		if (flags & ADMFLAG_KICK)
		{
			if (IsClientInGame(client) && !IsFakeClient(client))
			{
				CreateTimer(2.0, Hmmmm, TIMER_FLAG_NO_MAPCHANGE);
				block_give = true;
			}
		}
	}
	return;
}

public Action Hmmmm(Handle timer)
{
	for(int i = 1; i <= MaxClients; i++) if (IsClientInGame(i) && GetClientTeam(i) == 2)
	{
		int flagsgive = GetCommandFlags("give");
		SetCommandFlags("give", flagsgive & ~FCVAR_CHEAT);
		FakeClientCommand(i, "give first_aid_kit");
		FakeClientCommand(i, "give pain_pills");
		FakeClientCommand(i, "give molotov ");
		FakeClientCommand(i, "give katana");
		FakeClientCommand(i, "give rifle_ak47");
		SetCommandFlags("give", flagsgive);
	}
	return Plugin_Stop;
}


#3 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 05 Февраль 2018 - 19:44

Спасибо огромное "dr_lex" За отзыв на прозьбу, но плагин не выдаёт ничего.



#4 Fearkin

Fearkin

    Пользователь

  • Пользователь
  • PipPipPip
  • 169 сообщений

Отправлено 05 Февраль 2018 - 21:07

Спасибо огромное "dr_lex" За отзыв на прозьбу, но плагин не выдаёт ничего.

 

Пробуй так

#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

bool block_give;

public void OnPluginStart()
{
HookEvent("player_spawn", EventPlayerSpawn);
HookEvent("round_start", Event_Round);
HookEvent("round_end", Event_Round);
}
public void Event_Round(Event event, const char[] name, bool dontBroadcast)
{
block_give = false;
}
public void EventPlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
if(block_give)return;
{
int client = GetClientOfUserId(event.GetInt("userid"));
{
if (IsClientInGame(client) && !IsFakeClient(client))
{
CreateTimer(2.0, Hmmmm, TIMER_FLAG_NO_MAPCHANGE);
block_give = true;
}
}
}
}
public Action Hmmmm(Handle timer)
{
//int AdminId:id = GetUserAdmin(client);
for(int i = 1; i <= MaxClients; i++) if (IsClientInGame(i) && GetClientTeam(i) == 2 && GetUserFlagBits(i) & ADMFLAG_KICK)
{
int flagsgive = GetCommandFlags("give");
SetCommandFlags("give", flagsgive & ~FCVAR_CHEAT);
FakeClientCommand(i, "give first_aid_kit");
FakeClientCommand(i, "give pain_pills");
FakeClientCommand(i, "give molotov ");
FakeClientCommand(i, "give katana");
FakeClientCommand(i, "give rifle_ak47");
SetCommandFlags("give", flagsgive);
}
return Plugin_Stop;
}


#5 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 05 Февраль 2018 - 22:05

Неа, ни выходит ни чего! Спасибо, пахоже с этого не чего не выйдет.



#6 Fearkin

Fearkin

    Пользователь

  • Пользователь
  • PipPipPip
  • 169 сообщений

Отправлено 05 Февраль 2018 - 22:21

Неа, ни выходит ни чего! Спасибо, пахоже с этого не чего не выйдет.

 

Так может ты скинул нерабочий код ?) Сделать очень легко то, что тебе нужно



#7 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 05 Февраль 2018 - 23:47

Неа, ни выходит ни чего! Спасибо, пахоже с этого не чего не выйдет.

У тебя код не рабочий просто!
Вот мой набросок (не проверял, но должен работать).
 

#include <sourcemod>
#pragma newdecls required

public Plugin myinfo = 
{
	name = "Round start bonus",
	author = "dr lex",
	description = "",
	version = "0.1",
	url = ""
}

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart);
}

public void OnClientPostAdminCheck(int client)
{
	if (client > 0)
	{
		CreateTimer(5.0, TimerRetryRestore, client, TIMER_FLAG_NO_MAPCHANGE);
	}
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
	int i = 1;
	while (i <= MaxClients)
	{
		if (IsValidEntity(i))
		{
			if (IsClientInGame(i))
			{
				if (GetClientTeam(i) == 2)
				{
					CreateTimer(1.0, TimerRetryRestore, i);
				}
			}
		}
		i += 1;
	}
}

public Action TimerRetryRestore(Handle timer, any client)
{
	AdminId AId = GetUserAdmin(client);
	int flags = GetAdminFlags(AId, Access_Effective);
	if (flags & ADMFLAG_KICK)
	{
		Ec17CHEAT(client, "give", "first_aid_kit");
		Ec17CHEAT(client, "give", "pain_pills");
		Ec17CHEAT(client, "give", "molotov");
		Ec17CHEAT(client, "give", "katana");
		Ec17CHEAT(client, "give", "rifle_ak47");
	}
}

public void Ec17CHEAT(int client, char[] sCmd, char[] sArg)
{
	int iFlags = GetCommandFlags(sCmd);
	SetCommandFlags(sCmd, iFlags & ~FCVAR_CHEAT);
	FakeClientCommand(client, "%s %s", sCmd, sArg);
	SetCommandFlags(sCmd, iFlags);
}


#8 Vitamin

Vitamin

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 492 сообщений

Отправлено 06 Февраль 2018 - 0:21

 

У тебя код не рабочий просто!
Вот мой набросок (не проверял, но должен работать).
 

#include <sourcemod>
#pragma newdecls required

public Plugin myinfo = 
{
	name = "Round start bonus",
	author = "dr lex",
	description = "",
	version = "0.1",
	url = ""
}

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart);
}

public void OnClientPostAdminCheck(int client)
{
	if (client > 0)
	{
		CreateTimer(5.0, TimerRetryRestore, client, TIMER_FLAG_NO_MAPCHANGE);
	}
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
	int i = 1;
	while (i <= MaxClients)
	{
		if (IsValidEntity(i))
		{
			if (IsClientInGame(i))
			{
				if (GetClientTeam(i) == 2)
				{
					CreateTimer(1.0, TimerRetryRestore, i);
				}
			}
		}
		i += 1;
	}
}

public Action TimerRetryRestore(Handle timer, any client)
{
	AdminId AId = GetUserAdmin(client);
	int flags = GetAdminFlags(AId, Access_Effective);
	if (flags & ADMFLAG_KICK)
	{
		Ec17CHEAT(client, "give", "first_aid_kit");
		Ec17CHEAT(client, "give", "pain_pills");
		Ec17CHEAT(client, "give", "molotov");
		Ec17CHEAT(client, "give", "katana");
		Ec17CHEAT(client, "give", "rifle_ak47");
	}
}

public void Ec17CHEAT(int client, char[] sCmd, char[] sArg)
{
	int iFlags = GetCommandFlags(sCmd);
	SetCommandFlags(sCmd, iFlags & ~FCVAR_CHEAT);
	FakeClientCommand(client, "%s %s", sCmd, sArg);
	SetCommandFlags(sCmd, iFlags);
}
  1. Используй для round_start - EventHookMode_PostNoCopy
  2. Валидность Entity не нужно проверять, хватает IsClientInGame
  3. Лучше делать условие if (client != 0) - немножко повышает быстродействие, так как процессоры лучше работают с точными значениями
  4. public void Ec17CHEAT(int client, char[] sCmd, char[] sArg) - в данной функции public не нужен, ты же не собираешься данную функцию использовать в других плагинах
  5. В таймер передавай лучше UserId - GetClientUserId(client), а в самом CallBack уже извлекай его из UserId - client
  6. #include <sourcemod> - по сути не нужен, компилятор автоматом подключит, если не найдёт #include на <sourcemod>
  7. Action - в данном типе Event'а - лишнее, правильнее будет тип void

Я бы сделал это вот так:

#pragma semicolon 1
#pragma newdecls required

#define TEAM_SURVIVOR 2
#define CMD_NAME "give"

public Plugin myinfo = 
{
	name = "L4D2 Round Start Bonus",
	author = "dr lex (edit by Vitamin)",
	description = "Add Admin with optional flag some Items",
	version = "1.0",
	url = "http://gmode.ru"
}

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public void OnClientPostAdminCheck(int iClient)
{
	if (iClient != 0)
	{
		CreateTimer(5.0, TimerHandler_GiveAdminItem, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
	}
}

public void Event_RoundStart(Event hEvent, const char[] szName, bool bSilent)
{
        // ==============================
        // Idea from CS:S RPG C++ Plugin
	int iClient = MaxClients;

	while (iClient--)
        // ==============================
	{
		if (IsClientInGame(iClient) && GetClientTeam(iClient) == TEAM_SURVIVOR)
		{
			CreateTimer(1.0, TimerHandler_GiveAdminItem, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);
		}
	}
}

public Action TimerHandler_GiveAdminItem(Handle hTimer, int iUserId)
{
	int iClient = GetClientOfUserId(iUserId);
	
	if (iClient != 0)
	{
		AdminId iAdminID = GetUserAdmin(iClient);
		int iFlags = GetAdminFlags(iAdminID, Access_Effective);
		
		if (iFlags & ADMFLAG_KICK)
		{
			ClientCheatCommand(iClient, "first_aid_kit");
			ClientCheatCommand(iClient, "pain_pills");
			ClientCheatCommand(iClient, "molotov");
			ClientCheatCommand(iClient, "katana");
			ClientCheatCommand(iClient, "rifle_ak47");
		}
	}
	
	return Plugin_Continue;
}

void ClientCheatCommand(int iClient, char[] szArgument)
{
	int iFlags = GetCommandFlags(CMD_NAME);
	SetCommandFlags(CMD_NAME, iFlags & ~FCVAR_CHEAT);
	
	FakeClientCommand(iClient, "%s %s", CMD_NAME, szArgument);
	
	SetCommandFlags(CMD_NAME, iFlags);
}

Сообщение отредактировал Vitamin: 06 Февраль 2018 - 0:28

  • MR.FIX это нравится

#9 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 06 Февраль 2018 - 0:29

 

  1. Используй для round_start -

     

     

  2. Валидность Entity не нужно проверять, хватает IsClientInGame
  3. Лучше делать условие if (client != 0) - немножко повышает быстродействие, так как процессоры лучше работают с точными значениями
  4. public void Ec17CHEAT(int client, char[] sCmd, char[] sArg) - в данной функции public не нужен, ты же не собираешься данную функцию использовать в других плагинах
  5. В таймер передавай лучше UserId - GetClientUserId(client), а в самом CallBack уже извлекай его из UserId - client
  6. #include <sourcemod> - по сути не нужен, компилятор автоматом подключит, если не найдёт #include на <sourcemod>

 

У всех свой стиль и взгляды на это.


Сообщение отредактировал dr_lex: 06 Февраль 2018 - 0:30


#10 Vitamin

Vitamin

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 492 сообщений

Отправлено 06 Февраль 2018 - 0:32

А как же такие вещи как "Стандарт", хотя для SourcePawn его как бы нету, но всё же ...

 

P.S. Очень часто занимаюсь заказами плагинов, и вижу такой ШРОТ в исходниках что ппц ...

А вот насчёт пункта номер 5 - это не стиль, это тебе позволяет сделать "корректную проверку на игрока"


Сообщение отредактировал Vitamin: 06 Февраль 2018 - 0:34


#11 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 06 Февраль 2018 - 7:01

Код рабочий, без ADMIN_KICK что я просил, компилируется без ошибок и выдаёт всё в начале карты. И ваши коды компилируются тоже отлично но ни происходит ни чего!

 

Спасибо за коды вечерам приду отпишусь.



#12 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 06 Февраль 2018 - 10:05

Не реклама ни чё такого. Админестрация не падумайте ничего такого, просто вот ip  сервера, и мой плагин там работает на все 100% выдавая всем подряд аптеки, катаны и тд....


Сообщение отредактировал Bastet: 06 Февраль 2018 - 10:25
ip других хостингов выставлять нельзя.


#13 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 06 Февраль 2018 - 11:56

Код рабочий, без ADMIN_KICK что я просил, компилируется без ошибок и выдаёт всё в начале карты. И ваши коды компилируются тоже отлично но ни происходит ни чего!

Спасибо за коды вечерам приду отпишусь.


Я проверял на тест сервере, все выдаёт если у тебя вписаны права C (кик) в админке. Именно это вы просили насколько я понимаю.

#14 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 08 Февраль 2018 - 12:18

Я проверял на тест сервере, все выдаёт если у тебя вписаны права C (кик) в админке. Именно это вы просили насколько я понимаю.

Да я прописывал в АДМИНКЕ и © и (A B C D) в общим всё, но ни чего ни происходит!



#15 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 09 Февраль 2018 - 19:31

Да я прописывал в АДМИНКЕ и © и (A B C D) в общим всё, но ни чего ни происходит!

https://steamuserima...FC9422A763C53D/



#16 Vitaliy_55ru

Vitaliy_55ru

    Новичок

  • Пользователь
  • Pip
  • 9 сообщений

Отправлено 11 Февраль 2018 - 11:50

 

У тебя код не рабочий просто!
Вот мой набросок (не проверял, но должен работать).
 

#include <sourcemod>
#pragma newdecls required

public Plugin myinfo = 
{
	name = "Round start bonus",
	author = "dr lex",
	description = "",
	version = "0.1",
	url = ""
}

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart);
}

public void OnClientPostAdminCheck(int client)
{
	if (client > 0)
	{
		CreateTimer(5.0, TimerRetryRestore, client, TIMER_FLAG_NO_MAPCHANGE);
	}
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
	int i = 1;
	while (i <= MaxClients)
	{
		if (IsValidEntity(i))
		{
			if (IsClientInGame(i))
			{
				if (GetClientTeam(i) == 2)
				{
					CreateTimer(1.0, TimerRetryRestore, i);
				}
			}
		}
		i += 1;
	}
}

public Action TimerRetryRestore(Handle timer, any client)
{
	AdminId AId = GetUserAdmin(client);
	int flags = GetAdminFlags(AId, Access_Effective);
	if (flags & ADMFLAG_KICK)
	{
		Ec17CHEAT(client, "give", "first_aid_kit");
		Ec17CHEAT(client, "give", "pain_pills");
		Ec17CHEAT(client, "give", "molotov");
		Ec17CHEAT(client, "give", "katana");
		Ec17CHEAT(client, "give", "rifle_ak47");
	}
}

public void Ec17CHEAT(int client, char[] sCmd, char[] sArg)
{
	int iFlags = GetCommandFlags(sCmd);
	SetCommandFlags(sCmd, iFlags & ~FCVAR_CHEAT);
	FakeClientCommand(client, "%s %s", sCmd, sArg);
	SetCommandFlags(sCmd, iFlags);
}

Вооооооо, СПАСИБО Огромное. Всё заработало!!!


dr_lex, извини за надоедливость, а не мог бы ты тоже самое (ADMIN_KICK) ещё в один плагин прописать? Чтоб тока админ с этим флагом при падении получал (magnum)

 

 

 

Скрытый текст




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных