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

Knife DM 1.3

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #1
Knife DeathMatch

Простой плагин для Knife DM, который включает в себя:
  1. Автоматическое возрождение игроков при смерти
  2. Расстворение трупов после смерти
  3. Защиту при появлении игрока

Cvar`s:
sm_knife_dm_spawn_hp "35"
- Сколько HP будет у игрока при спавне.
sm_knife_dm_respawn_delay "1.0" - Через сколько секунд после смерти игрок возродится.
sm_knife_dm_protect_time "1.0" - Сколько секунд длится защита игрока при возрождении.
sm_knife_dm_remove_radgoll "1" - Удалять ли трупы после смерти.
sm_knife_dm_remove_radgoll_delay "1.0" - Через сколько секунд после смерти удалять труп.

Рекомендуется использование только на картах 35hp_ т.к. нет запрета оружия.

Писал для себя, выложил, может кому понадобится.

P.S.Если заметите баги/ошибки/недочеты или есть пожелания/предложения -> отпишитесь в этой теме.

--------------------------
Update 8.01.2014
Update 22.07.2014
 
Последнее редактирование модератором:

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

Исходники?!?!?!?!? :angry2:
(lysis не предлагать)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #3
Re: Knife DM v1.0

KorDen, надеюсь найдут баги и т.д., вот когда исправлю - выложу.
Для тебя же там ничего нового нет. :-D
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

R1KO, эх, не понимаешь ты духа GPL.. Баги публично находить гораздо лучше и активнее, потому что тогда плагин проще создавать, чем когда вслепую говорить буду, где у тебя там глюк или что...
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #5
Re: Knife DM v1.0

KorDen, добавил
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

Вроде работает уже некоторое время (вместо CSS:DM), ошибок критичных пока не было (хотя было один раз Invalid timer handle в KillTimerS, но вроде не повторялось, из-за чего - не уловил...), отлично :D
Единственное - я добавил переменную cssdm_version для корректной классификации в мониторингах, которые просматривают переменные
Теперь еще переписать dm_equipment, убрав функции расширения и можно вообще CSS:DM заменять полностью ;)
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Knife DM v1.0

1. Если получаешь команду игрока несколько раз, сохраняй ее в переменную
PHP:
// Вместо
if (GetClientTeam(client) == 2)
{
	// Code...
}
else if (GetClientTeam(client) == 3)
{
	// Code...
}

// Сделать
new team = GetClientTeam(client);
if (team == 2)
{
	// Code...
}
else if (team == 3)
{
	// Code...
}

// Или
switch (GetClientTeam(client))
{
	case 2:
	{
		// Code...
	}
	case 3:
	{
		// Code...
	}
}

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

3. Если игрок умер и вышел, то удаления трупа уже не будет, т.к. проверяется в игре ли он

4. В таймере не нужно проверять валидность игрока, т.к. ID этого игрока не изменяется, то есть если ты передал в таймере client (2), то при исполнении таймера ID (2) так и останется

5. Если игрок был за террористов и перешел за спецназ или наоборот, то таймер оживления не сработает

6. В блоке f_Respawn утечка должна быть, думаю я

7. Многие return'ы необязательны, лишний груз
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #8
Re: Knife DM v1.0

1. Если получаешь команду игрока несколько раз, сохраняй ее в переменную
PHP:
// Вместо
if (GetClientTeam(client) == 2)
{
	// Code...
}
else if (GetClientTeam(client) == 3)
{
	// Code...
}

// Сделать
new team = GetClientTeam(client);
if (team == 2)
{
	// Code...
}
else if (team == 3)
{
	// Code...
}

// Или
switch (GetClientTeam(client))
{
	case 2:
	{
		// Code...
	}
	case 3:
	{
		// Code...
	}
}
Исправлю.
2. Не вижу смысла проверок при спавне игрока на наличие в какой либо команде, если игрок возрождается, то он уже в команде, тем более один и тот же цвет игроку делаешь, независимо от команды
Цвет не один и тот же. Насколько я помню как только игрок вошел на сервер тоже вызывается спавн, надо проверить.

3. Если игрок умер и вышел, то удаления трупа уже не будет, т.к. проверяется в игре ли он

4. В таймере не нужно проверять валидность игрока, т.к. ID этого игрока не изменяется, то есть если ты передал в таймере client (2), то при исполнении таймера ID (2) так и останется

5. Если игрок был за террористов и перешел за спецназ или наоборот, то таймер оживления не сработает
Тоже исправлю.
6. В блоке f_Respawn утечка должна быть, думаю я

7. Многие return'ы необязательны, лишний груз
Буду разбиратся

Добавлено через 49 секунд
Единственное - я добавил переменную cssdm_version для корректной классификации в мониторингах, которые просматривают переменные
Теперь еще переписать dm_equipment, убрав функции расширения и можно вообще CSS:DM заменять полностью ;)

Так и планирую.
 
Последнее редактирование:

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

2. Не вижу смысла проверок при спавне игрока на наличие в какой либо команде, если игрок возрождается, то он уже в команде

Скажи это валвам :D Вроде сейчас исправлено и не может быть (хотя не факт что 100% не случается), но было время когда player_spawn вызывался при входе игрока на сервер и при переходе его в спектры :-D Именно поэтому лучше все же эти проверки делать...
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #10
Re: Knife DM v1.0

но было время когда player_spawn вызывался при входе игрока на сервер и при переходе его в спектры
По крайней мере на в34 так. На стиме не проверял спавн. Приеду домой - проверю всё и возобновлю работы над плагином.
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Knife DM v1.0

Действительно, *** евент =)
PHP:
#include <sourcemod>

public OnPluginStart()
{
	HookEvent("player_spawn", Event_OnPlayerSpawn);
}

public Event_OnPlayerSpawn(Handle:event, const String:name[], bool:silent)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));

	PrintToServer("Client Spawned = %N (%d)", client, client);
	PrintToServer("In Game = %s", IsClientInGame(client) ? "YES" : "NO");
	PrintToServer("Alive = %s", IsPlayerAlive(client) ? "YES" : "NO");
	PrintToServer("TEAM = %d", GetClientTeam(client));
}
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

Тэкс.. Короче вот моя более-менее улучшенная версия, правда вырезан код растворения трупа, труп просто удаляется (добавить несложно)

Передача ragdoll из OnClientDeath в датапаке сделана для будущего расширения на полноценный DM, поскольку если время исчезновения трупа больше, чем время респавна, труп не будет исчезать (m_hRagdoll будет -1, ведь клиент уже появился заново и старый рэгдолл не связан с ним)
Плюс по идее исправлена ошибка убийства уже не существующего таймера
 

Вложения

  • knife_dm.sp
    3.4 КБ · Просмотры: 21
  • Мне нравится
Реакции: R1KO

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Knife DM v1.0

KorDen
1. В player_spawn разве есть team?

2. В f_Respawn делать client > 0 не нужно

3. Вместо if (team == 2 || team == 3) проще сделать if (GetEventInt(event, "team") > 1)

4. Проверки IsValidEntity и client > 0 вместе не нужны, думаю
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

4. Проверки IsValidEntity и client > 0 вместе не нужны, думаю
Думай голова, думай :)
C-подобный:
L 06/26/2013 - 13:00:30: [SM] Native "AcceptEntityInput" reported: Entity 131 (131) is not a CBaseEntity
L 06/26/2013 - 13:00:30: [SM] Displaying call stack trace for plugin "knife_dm.smx":
L 06/26/2013 - 13:00:30: [SM]   [0]  Line 82, knife_dm.sp::f_Dissolve()
Я тоже "думал", оказалось недодумал.... Хотя в принципе ты прав, >0 можно убрать...

С player_spawn да, намудрил... Хотел GetClientTeam, но мозг написал как до этого в OnPlayerTeam...
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #15
Re: Knife DM v1.0

KorDen, а никак нельзя решить проблему, что когда время таймера на спав меньше времени на расстворение то трупы не расстворяются?
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Re: Knife DM v1.0

KorDen, а никак нельзя решить проблему, что когда время таймера на спав меньше времени на расстворение то трупы не расстворяются?

Я же как раз и написал такую версию, вроде должна работать корректно, разве нет?
Вот уже более откорректированная версия, вроде эта проблема не должна быть
 

Вложения

  • knife_dm.sp
    3.3 КБ · Просмотры: 25
  • Мне нравится
Реакции: R1KO

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Knife DM v1.0

KorDen
1. В OnPlayerTeam лучше проверить предыдущую команду игрока перед удалением таймеров

2. В OnPlayerSpawn и OnPlayerTeam, думаю, лучше вставить условие (if (client > 0)) и уже потом что-то делать с клиентом

3. Приставка Action в OnPlayerDeath необязательна

4. В ProtectTimer_CallBack и f_Respawn необязательно проверять, в игре ли клиент, если клиент выйдет, таймер удалится
 
  • Мне нравится
Реакции: R1KO

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Re: Knife DM v1.0

R1KO
Игрок зашел (Команда = 0), перешел в наблюдение (Команда = 1), условие > 1, то есть выполнится удаление таймеров => зачем проверять таймера, если они не существуют даже
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • Автор ресурса
  • #20
Re: Knife DM v1.0

так ?

PHP:
#pragma semicolon 1
#include <sourcemod>
#include <cstrike>
#include <sdktools>

new Handle:Timer_Respawn[MAXPLAYERS+1] = {INVALID_HANDLE, ... },
	Handle:Timer_Dissolve[MAXPLAYERS+1] = {INVALID_HANDLE, ... },
	Handle:Timer_Protect[MAXPLAYERS+1] = {INVALID_HANDLE, ... };

public Plugin:myinfo = 
{
	name = "Knife DeathMatch",
	author = "R1KO, remake by KorDen",
	version = "1.0",
	url = "http://dev.sky-play.ru"
};

public OnPluginStart()
{
	CreateConVar("cssdm_version", "2.1.6-compat", "Fake cvar for monitors", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
	HookEvent("player_death", OnPlayerDeath);
	HookEvent("player_spawn", OnPlayerSpawn);
	HookEvent("player_team", OnPlayerTeam);
}

public OnPlayerTeam(Handle:event, const String:name[], bool:silent)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if (client > 0)
	{
		new team = GetEventInt(event, "team");
		if (team > 1 && GetEventInt(event, "oldteam") > 0)
			Timer_Respawn[client] = CreateTimer(1.0, f_Respawn, client);
		else
			KillTimerS(client);
	}
}

public OnPlayerSpawn(Handle:event, const String:name[], bool:silent)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid")), team=GetClientTeam(client);
	if (client > 0)
	{
		SetEntProp(client, Prop_Data, "m_takedamage", 0);
		if (team == 2) SetNewColor(client, 255, 75, 75, 200);
		else if (team==3) SetNewColor(client, 75, 75, 255, 200);
		Timer_Protect[client] = CreateTimer(1.0, ProtectTimer_CallBack, client);
	}
}

public Action:ProtectTimer_CallBack(Handle:timer, any:client)
{
	if (IsClientInGame(client) && IsPlayerAlive(client))
	{
		SetEntProp(client, Prop_Data, "m_takedamage", 2);
		SetNewColor(client, 255, 255, 255, 255);
	}
	Timer_Protect[client] = INVALID_HANDLE;
}

SetNewColor(client, r, g, b, a)
{
	SetEntityRenderMode(client, RENDER_TRANSCOLOR);
	SetEntityRenderColor(client, r, g, b, a);
}

public OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if (IsValidEntity(client) && IsClientInGame(client))
	{
		new ragdoll = GetEntPropEnt(client, Prop_Send, "m_hRagdoll");
		if(ragdoll>0)
		{
			new Handle:datapack = INVALID_HANDLE;
			Timer_Dissolve[client] = CreateDataTimer(2.0, f_Dissolve, datapack, TIMER_FLAG_NO_MAPCHANGE);
			WritePackCell(datapack, ragdoll);
			WritePackCell(datapack, client);
			ResetPack(datapack);
		}
	}
	Timer_Respawn[client] = CreateTimer(3.0, f_Respawn, client);
}

public Action:f_Dissolve(Handle:timer, Handle:datapack)
{
	new ragdoll=ReadPackCell(datapack);
	new client=ReadPackCell(datapack);
	if(IsValidEntity(ragdoll))
		AcceptEntityInput(ragdoll, "kill");
	Timer_Dissolve[client] = INVALID_HANDLE;
}

public Action:f_Respawn(Handle:timer, any:client)
{
	Timer_Respawn[client] = INVALID_HANDLE;
	if (IsClientInGame(client) && !IsPlayerAlive(client))
		CS_RespawnPlayer(client);
}

public OnClientDisconnect(client)
	KillTimerS(client);

KillTimerS(client)
{
	if (Timer_Respawn[client] != INVALID_HANDLE)
	{
		KillTimer(Timer_Respawn[client]);
		Timer_Respawn[client] = INVALID_HANDLE;
	}
	if (Timer_Dissolve[client] != INVALID_HANDLE)
	{
		KillTimer(Timer_Dissolve[client]);
		Timer_Dissolve[client] = INVALID_HANDLE;
	}
	if (Timer_Protect[client] != INVALID_HANDLE)
	{
		KillTimer(Timer_Protect[client]);
		Timer_Protect[client] = INVALID_HANDLE;
	}
}
 
Сверху Снизу