Убийство АФК в 8.00

OFFSprings

Участник
Сообщения
14
Реакции
0
Ребят подскажите правильно ли я написал плагин,который убивает АФК в 8.00.
Все таки я не уверен.Компилятор не скачивал,ибо хотел человеку просто помочь.

PHP:
#include <sourcemod>
#include <sdktoos>
#include <cstrike>


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

public Action:OnRoundStart(Handle:event,const String[],bool dontBroadcast);
{
    PrintToChatAll("/x03 АФК /x01 будут /x03 убиты")
	CreateTimer(60.0,TimerKillAfk);
}


public TimerKillAfk(Handle:timer);
    for (int i=1,i<=MaxClients,i++)
	{
		if(IsClientInGame(i) && IsPlayerAlive(i))
		{
			float EyePosition=GetClientEyePosition(i,float position[3]);
			float RespawnPosition=GetClientAbsAngles(i,float respawnposition[3]);
			if (positon[0]=0 && position[1]=0 && position[2]=0 && respawnposition[0]=0 && respawnposition[1]=0 && respawnposition[2]=0)
			{
			    ForcePlayerSuicide(i);
			}
		KillTimer();
		}
	}
PrintToChatAll("/x03 АФК /x04 Убиты");
Мне просто кажется ,что начальная позиция игрока после возрождения не [0;0;0]
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
начальная позиция игрока после возрождения не [0;0;0]
Подумай логически: точек респавна несколько десятков с небольшим расстоянием друг от друга, следовательно, у всех уже разные координаты.
0;0;0; - это начало карты, её "первый" угол из 4. GetClientAbsOrigin(client, Float:vec[3]); даст координаты, где сейчас на карте находится игрок.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
OFFSprings, как минимум при спавне нужно сохранить координаты игрока чтобы потом было с чем сравнивать.
 

OFFSprings

Участник
Сообщения
14
Реакции
0
Подумай логически: точек респавна несколько десятков с небольшим расстоянием друг от друга, следовательно, у всех уже разные координаты.
0;0;0; - это начало карты, её "первый" угол из 4. GetClientAbsOrigin(client, Float:vec[3]); даст координаты, где сейчас на карте находится игрок.
А позицию глаз правильно выбрал?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
позицию глаз правильно выбрал?
Каша у тебя.
PHP:
float EyePosition=GetClientEyePosition(i,float position[3]);            float RespawnPosition=GetClientAbsAngles(i,float respawnposition[3]);
PHP:
decl Float:EyePosition[3], Float:RespawnPosition[3];
GetClientEyePosition(i, EyePosition);
GetClientAbsAngles(i, RespawnPosition);
Если у тебя DM, то новый респавн может совпасть с бывшим АФК положением игрока, что не есть хорошо.
 

OFFSprings

Участник
Сообщения
14
Реакции
0
Вот так переделал чуть чуть.
PHP:
#include <sourcemod>
#include <sdktoos>
#include <cstrike>


public OnPluginStart();
{
	HookEvent("round_start",OnRoundStart,EventHookMode_PostNoCopy);
}
public OnRoundStart(Handle:event,const String:name[],bool dontBroadcast);
{
	HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_PostNoCopy);
}

public OnPlayerSpawn(Handle:event,const String:name[],bool dontBroadCast);
       int client=GetClientOfUserid(GetEventInt(event,"userid"));
	   decl float EyePosition1=GetClientEyePosition(client,float vec1[3]);
	   decl float RespawnPosition1=GetClientAbsAngles(client,float vec2[3]);
	   CreateTimer(30.0,TimerCheckAngles);

public TimerCheckAngles(Handle:timer);
       decl float EyePosition2=GetClientEyePosition(client,float vec3[3]);
	   decl float RespawnPosition2=GetClientAbsAngles(client,float vec[4]);
	   CreateTimer(30.0,TimerAfkKillers);

public TimerAfkKillers(Handle:timer);
       If (EyePosition1=EyePosition2 && RespawnPosition1=RespawnPosition2)
	   {
		   ForcePlayerSuicide(client);
	   }
return Plugin_Handled;
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
переделал чуть чуть
Ещё хуже. В первом коде хоть часть получения координат страдала, а тут почти всё с ошибками.
Но событие Спавна упоминается верно. round_start не даст координат, если игрок вступил чуть позже в команду.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
OFFSprings,
PHP:
HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_PostNoCopy);
Если ты ставишь EventHookMode_PostNoCopy то Handle:event будет 0. И индекс игрока ты не получишь.
И хукай спавн в OnPluginStart()

Координаты не получай при спавне. а через таймер после спавна. Хотябы на 1 сек. Ибо игрок спавнится чуть выше и его углы и позиция поменяются.

И ты определись на каком синтаксисе пишешь, а то глаза болят смотреть.

И ф-и не верно написаны, убери ; и возьми всё в { }
 

OFFSprings

Участник
Сообщения
14
Реакции
0
Ещё хуже. В первом коде хоть часть получения координат страдала, а тут почти всё с ошибками.
Но событие Спавна упоминается верно. round_start не даст координат, если игрок вступил чуть позже в команду.
Подскажи плиз просто словами,не кодом,что не так.Я новичок просто.Спасибо за помощь :)

Добавлено через 6 минут
OFFSprings,
PHP:
HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_PostNoCopy);
Если ты ставишь EventHookMode_PostNoCopy то Handle:event будет 0. И индекс игрока ты не получишь.
И хукай спавн в OnPluginStart()

Координаты не получай при спавне. а через таймер после спавна. Хотябы на 1 сек. Ибо игрок спавнится чуть выше и его углы и позиция поменяются.

И ты определись на каком синтаксисе пишешь, а то глаза болят смотреть.

И ф-и не верно написаны, убери ; и возьми всё в { }

Просто я хотел чтобы афк умирали ровно в 8:00,Я поэтому сперва отлавливал событие начала раунда,а для этого события отлавливал возрождения игрока,и вот еще интерестно,если в одной функции объявил переменную,ее можно оъявлять в другой функции или все-таки static в начале скрипта писать?

Добавлено через 54 минуты
Или вот вопрос,вот такой вариант будет правильным
PHP:
public Action:TimerCheck(Handle:timer)
{
     int client=GetClientOfUserId(GetEventInt(timer,"userid"));
}

Добавлено через 1 час 17 минут
Вот переделал так .
PHP:
#include <sourcemod>
#include <sdktoos>
#include <cstrike>


public OnPluginStart()
{
    HookEvent("player_spawn",OnPlayerSpawn,EventHookMode_Pre);
}

public Action:OnPlayerSpawn(Handle:event,const String:name[],bool dontBroadcast)
{
       CreateTimer(3.0,TimerCheck);
}

public Action:TimerCheck(Handle:timer)
{
	int client=GetClientOfUserId(GetEventInt(timer,"userid"));
	decl float p_Eyes=GetClientEyePosition(client,vec1[3]);
	decl float p_Resp=GetClientAbsAngles(client,vec2[3]);
	CreateTimer(27.0,TimerCheckTwo);
}

public Action:TimerCheckTwo(Handle:timer)
{
    decl float g_Eyes=GetClientEyePosition(client,vec3[3]);
	decl float g_Resp=GetClientAbsAngles(client,vec4[3]);
	CreateTimer(30.0,TimerToDie);
}

public Action:TimerToDie(Handle:timer)
{
    If (p_Eyes=g_Eyes && p_Resp=g_Resp)
	{
		ForcePlayerSuicide(client);
	}
}
return Plugin_Handled()
 
Последнее редактирование:
Сверху Снизу