[Left 4 Dead 1, 2] Кооп на 16-20 игроков

Обсуждаем все, что относится к выделенным серверам *NIX (Unix, Linux) и Windows
Сообщение
Автор
SupermenCJ
Сержант
Сержант
Сообщения: 40
Зарегистрирован: 26.10.2013
Благодарил (а): 2 раза
Поблагодарили: 8 раз

#1981 Сообщение 26.10.2013, 13:00

Фикс , который позволяет избежать возрождения живого игрока ( идея заимствована у пользователя Accelerator74 ):
l4d2_defibfix.sp
#include <sourcemod>
#include <sdktools>

public OnPluginStart()
{
HookEvent("defibrillator_begin", Event_DefibrillatorBegin);
}

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

new survivorplayers = 0;
new livesurvivorplayers = 0;

for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i) && GetClientTeam(i) == 2)
{
survivorplayers++;
}
if (IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i))
{
livesurvivorplayers++;
}
}

new actualsurvivorplayers = survivorplayers - livesurvivorplayers;

if (actualsurvivorplayers == 0)
{
RemovePlayerItem(client, GetPlayerWeaponSlot(client, 3));
GiveItem(client, "defibrillator");
PrintToChat(client, "\x04All players is alive!");
PrintHintText(client, "All players is alive!");
}

return Plugin_Continue;
}

GiveItem(Client, String:Item[22])
{
new flags = GetCommandFlags("give");
SetCommandFlags("give", flags & ~FCVAR_CHEAT);
FakeClientCommand(Client, "give %s", Item);
SetCommandFlags("give", flags|FCVAR_CHEAT);
}
http://rghost.ru/49731380

Добавлено спустя 5 минут 49 секунд:
Фикс , предотвращает автодроп м60 , у которого закончились патроны :
l4d2_antidropM60.sp
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

#define PLUGIN_VERSION "1.0"

public Plugin:myinfo =
{
name = "[L4D2] Anti-Drop",
author = "McFlurry",
description = "Stops you from firing the last bullet of your m60 and gives you a director hint to find ammo",
version = PLUGIN_VERSION,
url = "N/A"
}

public OnPluginStart()
{
decl String:game_name[64];
GetGameFolderName(game_name, sizeof(game_name));
if (!StrEqual(game_name, "left4dead2", false))
{
SetFailState("Plugin supports Left 4 Dead 2 only.");
}
}

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
new String:wep[64];
new ent = GetPlayerWeaponSlot(client, 0);
GetClientWeapon(client, wep, sizeof(wep));
if(buttons & IN_ATTACK && StrEqual(wep, "weapon_rifle_m60", false) && ent > MaxClients && GetEntProp(ent, Prop_Data, "m_iClip1", 1) == 1)
{
buttons &= ~IN_ATTACK;
PrintHintText(client, "Find ammobox for your M60!");
return Plugin_Changed;
}
return Plugin_Continue;
}
http://rghost.ru/49731469

Плагин для сервера , который позволяет игроку по команде !drop выбросить из рук то оружие, которое он держит в данный момент (кроме пистолетов и рукапашного оружия). Работает как на windows, так и на linux серверах корректно. Не требует дополнительного файлов в папку gamedata.

andreiii
Лейтенант
Лейтенант
Сообщения: 228
Зарегистрирован: 24.11.2011
Благодарил (а): 1 раз
Поблагодарили: 8 раз

#1982 Сообщение 26.10.2013, 17:34

SupermenCJ, спасибо за фиксы.

Аватара пользователя
leks19
Капитан
Капитан
Сообщения: 376
Зарегистрирован: 10.02.2011
Откуда: Беларусь
Благодарил (а): 12 раз
Поблагодарили: 15 раз
Контактная информация:

#1983 Сообщение 26.10.2013, 18:08

Выкладываю по просьбам

Сборка для режима Survival (сборка ещё очень сырая)
L4D2_Survival-12_Dr_leks_26.10.2013_linux бета версия
Изображение

Аватара пользователя
Jonny
Полковник
Полковник
Сообщения: 1371
Зарегистрирован: 30.05.2008
Благодарил (а): 23 раза
Поблагодарили: 54 раза

#1984 Сообщение 01.11.2013, 16:43

L4D2_Coop-16_01.11.2013_windows.zip (4.9 МБ)
L4D2_Coop-16_01.11.2013_linux.zip (5.8 МБ)

Маленькое изменение функции определения пройдена карта или нет. Плюс обновление до актуальных версий родительских модов.
Никакого отношения к нацистским группам и направлениям не имею.

emilio3
Нович0к
Нович0к
Сообщения: 13
Зарегистрирован: 04.08.2013
Поблагодарили: 1 раз

#1985 Сообщение 08.11.2013, 09:33

leks19 писал(а):Выкладываю по просьбам

Сборка для режима Survival (сборка ещё очень сырая)
L4D2_Survival-12_Dr_leks_26.10.2013_linux бета версия
Leks you can upload new vercion for coop linux, i have old vercion in server L4D2_Coop-16_Dr_leks_24.08.2013_linux work perfect in linux , please

SupermenCJ
Сержант
Сержант
Сообщения: 40
Зарегистрирован: 26.10.2013
Благодарил (а): 2 раза
Поблагодарили: 8 раз

#1986 Сообщение 09.11.2013, 19:49

Специально для Jonny код для коробки lightningbox (молния скачет между игроками) , надеюсь, добавишь в хардмод.
http://rghost.ru/50054970

Добавлено спустя 2 минуты 51 секунду:
На основе плагина l4d_starfall.sp можно сделать коробку Метеорбокс (при ее открытии с неба падают метеориты).
http://rghost.ru/50055081

Аватара пользователя
Jonny
Полковник
Полковник
Сообщения: 1371
Зарегистрирован: 30.05.2008
Благодарил (а): 23 раза
Поблагодарили: 54 раза

#1987 Сообщение 09.11.2013, 22:58

SupermenCJ писал(а):На основе плагина l4d_starfall.sp можно сделать коробку Метеорбокс (при ее открытии с неба падают метеориты).
Я вроде пробовал - у некоторых игроков сильно лагает.

А лайтинг бокс интересная штука, постараюсь себя заставить внести ее в хардмод )
Никакого отношения к нацистским группам и направлениям не имею.

sambuk
Лейтенант
Лейтенант
Сообщения: 132
Зарегистрирован: 25.05.2012
Поблагодарили: 7 раз

#1988 Сообщение 10.11.2013, 02:47

Jonny
как так,ты теперь хочешь не хочешь админ на всех серверах ,это уже похоже на контроль.(анб)

Аватара пользователя
Jonny
Полковник
Полковник
Сообщения: 1371
Зарегистрирован: 30.05.2008
Благодарил (а): 23 раза
Поблагодарили: 54 раза

#1989 Сообщение 10.11.2013, 10:13

Админ на всех серверах? Чего чего?
Последний раз редактировалось Renaissance 10.11.2013, 11:05, всего редактировалось 1 раз.
Причина: И на моем сервере админ?! лол
Никакого отношения к нацистским группам и направлениям не имею.

Аватара пользователя
leks19
Капитан
Капитан
Сообщения: 376
Зарегистрирован: 10.02.2011
Откуда: Беларусь
Благодарил (а): 12 раз
Поблагодарили: 15 раз
Контактная информация:

#1990 Сообщение 10.11.2013, 14:39

emilio3 писал(а):
leks19 писал(а):Выкладываю по просьбам

Сборка для режима Survival (сборка ещё очень сырая)
L4D2_Survival-12_Dr_leks_26.10.2013_linux бета версия
Leks you can upload new vercion for coop linux, i have old vercion in server L4D2_Coop-16_Dr_leks_24.08.2013_linux work perfect in linux , please
Later, lay, when the second server will do
sambuk писал(а):Jonny
как так,ты теперь хочешь не хочешь админ на всех серверах ,это уже похоже на контроль.(анб)
lol именно так садятся на шею людям =D
Jonny писал(а):Админ на всех серверах? Чего чего?
Поздравляю Jonny тебе на шею сели пару пухленьких админов серверов. =D
Изображение

Аватара пользователя
Jonny
Полковник
Полковник
Сообщения: 1371
Зарегистрирован: 30.05.2008
Благодарил (а): 23 раза
Поблагодарили: 54 раза

#1991 Сообщение 10.11.2013, 23:15

Вот примерно так

Код: Выделить всё

D:\Left 4 Dead\HM2_Project_v11.3 [Lighting]>makefile_hardmod_lite.bat
--------------------------------------------
Building hardmod.sp ...
--------------------------------------------
Скопировано файлов:         1.
SourcePawn Compiler 1.5.3-dev+3948
Copyright (c) 1997-2006, ITB CompuPhase, (C)2004-2008 AlliedModders, LLC

hardmod/lighting.inc(32) : error 017: undefined symbol "g_sprite"
hardmod/lighting.inc(34) : error 017: undefined symbol "LINGHNING2"
hardmod/lighting.inc(40) : error 017: undefined symbol "AttackerTime"
hardmod/lighting.inc(40) : warning 215: expression has no effect
hardmod/lighting.inc(40) : error 001: expected token: ";", but found "]"
hardmod/lighting.inc(40) : error 029: invalid expression, assumed zero
hardmod/lighting.inc(40) : fatal error 127: too many error messages on one line

Compilation aborted.
6 Errors.
Не удается найти указанный файл.
--------------------------------------------
Built hardmod.sp as .smx
--------------------------------------------

D:\Left 4 Dead\HM2_Project_v11.3 [Lighting]>

Код: Выделить всё

new Handle:hm_lightning_damage1;
new Handle:hm_lightning_damage2;
new Handle:hm_lightning_todeath;
new Handle:hm_lightning_range;
new Handle:hm_lightning_life;

new Handle:hm_ammochance_lightningbox;

new Lightning[MAXPLAYERS+1][MAXPLAYERS+1];


public LightingBoxOnPluginStart()
{
	Version += 1;
	hm_ammochance_lightningbox = CreateConVar("hm_ammochance_lightningbox", "0", "", FCVAR_PLUGIN);
}

ShowEffectToPlayer(attacker, victim)
{
	decl Float:pos1[3];
	decl Float:pos2[3];
	GetClientEyePosition(victim, pos1);
	GetClientEyePosition(attacker, pos2);

	DamageEffects(victim, hm_lightning_damage1);
 
	new Float:life=0.2;
	new Float:width1=5.0;
 	
	ShowParticle(pos1, "electrical_arc_01_system", 0.5);		
	
	TE_SetupBeamPoints(pos1, pos2, g_sprite, 0, 0, 0, life, width1, width1, 1, 0.0,whiteColor, 0);
	TE_SendToAll();	
	EmitSoundToAll(LINGHNING2, 0, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, 100, _, pos1, NULL_VECTOR, false, 0.0);	
	ClientCommand(victim, "vocalize PlayerDeath");
}

public Action:ScanPlayer(Handle:timer,any:attacker)
{
	new Float:time=AttackerTime[attacker];	
	new victim=Victim[attacker];
	 
	if((GetEngineTime()-time)>GetConVarFloat(hm_lightning_life))
	{
		ClearLightning(attacker);
		return Plugin_Stop;
	}
	if(victim >0)
	{
		new v=SearchVictim(victim,attacker);
		if(v>0)
		{
			Victim[attacker]=v; 
			Lightning[attacker][v]=1;
			ShowEffectToPlayer(victim, v);
		}
		else if(v==0)
		{
			decl Float:pos[3];
			GetClientEyePosition(victim, pos);
			pos[2]-=15.0;
			ShowParticle(pos, "electrical_arc_01_system", 0.5);
			EmitSoundToAll(LINGHNING2, 0, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, 100, _, pos, NULL_VECTOR, false, 0.0);	
			if(GetConVarInt(hm_lightning_todeath)==1)
			{
				DamageEffects(victim, hm_lightning_damage2);
			}
			else if	(!IsPlayerIncapped(victim))
			{
				DamageEffects(victim, hm_lightning_damage2);
			}
			else if	(GetConVarInt(hm_lightning_todeath)==0)
			{
				ClearLightning(attacker);
			}
		}
		else if(v<0)
		{
			ClearLightning(attacker);
			return Plugin_Stop;
		}
		return Plugin_Continue;
	}
	else
	{
		ClearLightning(attacker);
		return Plugin_Stop;
	}
}

ClearLightning(attacker)
{
	for(new client = 1; client <= MaxClients; client++)
	{
		Lightning[attacker][client]=0;
	}
	Victim[attacker]=0;
	AttackerTime[attacker]=0.0;
}

SearchVictim(victim, attacker)
{
	new t=0;
	decl Float:pos1[3];
	decl Float:pos2[3];
	GetClientEyePosition(victim, pos1);
	new bool:left=false;
	new Float:range=GetConVarFloat(hm_lightning_range);
	for (new client=1; client<=MaxClients; client++)
	{
		if(IsClientInGame(client) && IsPlayerAlive(client))
		{
			if(Lightning[attacker][client]==0)
			{
				if(GetClientTeam(client)==2)left=true;
				GetClientEyePosition(client, pos2);
				new Float:d=GetVectorDistance(pos1, pos2);
				if(d<range)
				{
					new bool:visible=IfTwoPosVisible(pos1,pos2, 0);
					if(visible)
					{
						t=client;
						break;
					}
				}
			}
		}
	}
	
	if(!left)t=-1;
	return t;
}

public ShowParticle(Float:pos[3], String:particlename[], Float:time)
{
	new particle = CreateEntityByName("info_particle_system");
	if (IsValidEdict(particle))
	{
		TeleportEntity(particle, pos, NULL_VECTOR, NULL_VECTOR);
		DispatchKeyValue(particle, "effect_name", particlename);
		DispatchKeyValue(particle, "targetname", "particle");
		DispatchSpawn(particle);
		ActivateEntity(particle);
		AcceptEntityInput(particle, "start");
		CreateTimer(time, DeleteParticles, particle, TIMER_FLAG_NO_MAPCHANGE);
	} 
}

stock DamageEffects(target, Handle:damageconvar)
{
	decl String:damage[10];
	GetConVarString(damageconvar, damage, 10);
	decl String:N[20];
	Format(N, 20, "target%d", target);	
	new pointHurt = CreateEntityByName("point_hurt");	
	if(pointHurt<=0)return;
	DispatchKeyValue(target, "targetname", N);			
	DispatchKeyValue(pointHurt, "Damage", damage);				
	DispatchKeyValue(pointHurt, "DamageTarget", N);
	DispatchKeyValue(pointHurt, "DamageType", "8");			
	DispatchSpawn(pointHurt);									
	AcceptEntityInput(pointHurt, "Hurt"); 					
	AcceptEntityInput(pointHurt, "Kill"); 	
	RemoveEdict(pointHurt);
}

public Action:DeleteParticles(Handle:timer, any:particle)
{
	if (IsValidEntity(particle))
	{
		decl String:classname[64];
		GetEdictClassname(particle, classname, sizeof(classname));
		if (StrEqual(classname, "info_particle_system", false))
			{
				AcceptEntityInput(particle, "stop");
				AcceptEntityInput(particle, "kill");
				RemoveEdict(particle);
			}
	}
}

public AttachParticle(i_Ent, String:s_Effect[], Float:f_Origin[3])
{
	decl i_Particle;
	decl String:s_TargetName[32];
	i_Particle = CreateEntityByName("info_particle_system");
	
	if (IsValidEdict(i_Particle))
	{
		TeleportEntity(i_Particle, f_Origin, NULL_VECTOR, NULL_VECTOR);
		FormatEx(s_TargetName, sizeof(s_TargetName), "target%d", i_Ent);
		DispatchKeyValue(i_Particle, "targetname", s_TargetName);
		GetEntPropString(i_Ent, Prop_Data, "m_iName", s_TargetName, sizeof(s_TargetName));
		DispatchKeyValue(i_Particle, "parentname", s_TargetName);
		DispatchKeyValue(i_Particle, "effect_name", s_Effect);
		DispatchSpawn(i_Particle);
		SetVariantString(s_TargetName);
		AcceptEntityInput(i_Particle, "SetParent", i_Particle, i_Particle, 0);
		ActivateEntity(i_Particle);
		AcceptEntityInput(i_Particle, "Start");
	}
	return i_Particle;
}

bool:IfTwoPosVisible(Float:pos1[3], Float:pos2[3], self)
{
	new bool:r=true;
	new Handle:trace = TR_TraceRayFilterEx(pos2, pos1, MASK_SOLID, RayType_EndPoint, TraceRayDontHitSelfAndLive,self);
	if(TR_DidHit(trace))
	{
		r=false;
	}
 	CloseHandle(trace);
	return r;
}

public bool:TraceRayDontHitSelfAndLive(entity, mask, any:data)
{
	if(entity == data) 
	{
		return false; 
	}
	else if(entity>0 && entity<=MaxClients)
	{
		if(IsClientInGame(entity))
		{
			return false;
		}
	}
	return true;
}

stock bool:IsPlayerIncapped(client)
{
	if (GetEntProp(client, Prop_Send, "m_isIncapacitated", 1)) return true;
	return false;
}

public PrecacheOther()
{
	PrecacheParticle("electrical_arc_01_system");
}

public PrecacheSounds()
{
	PrecacheSound("ambient/energy/zap1.wav", true);
}
Добавлено спустя 2 минуты 44 секунды:
Боюсь спрашивать, но что там со статистикой в последней версии? И вообще какие ошибки есть?

Добавлено спустя 3 минуты 12 секунд:
Я вообще забросил опять это дело как то, но надо доделать. Надо чтобы статистика работала правильно всегда, после чего нужно сделать версию и для первой части тоже.

Так же мне интересно что там получилось с хардмодом в режиме выживания, когда это можно глазами посмотреть непосредственно в игре, когда там играют?
Никакого отношения к нацистским группам и направлениям не имею.

Аватара пользователя
leks19
Капитан
Капитан
Сообщения: 376
Зарегистрирован: 10.02.2011
Откуда: Беларусь
Благодарил (а): 12 раз
Поблагодарили: 15 раз
Контактная информация:

#1992 Сообщение 11.11.2013, 00:39

Jonny писал(а): Так же мне интересно что там получилось с хардмодом в режиме выживания, когда это можно глазами посмотреть непосредственно в игре, когда там играют?
Я сегодня снес это режем так как он-лайн не очень. Может когда не будь доделаю =)
Место этого поставил ещё один coop 16 но только чисто доп. кампаниями
Изображение

SupermenCJ
Сержант
Сержант
Сообщения: 40
Зарегистрирован: 26.10.2013
Благодарил (а): 2 раза
Поблагодарили: 8 раз

#1993 Сообщение 11.11.2013, 09:12

Подправленный код для коробки lightningbox
http://rghost.ru/50088597

Аватара пользователя
Jonny
Полковник
Полковник
Сообщения: 1371
Зарегистрирован: 30.05.2008
Благодарил (а): 23 раза
Поблагодарили: 54 раза

#1994 Сообщение 11.11.2013, 12:28

_

Код: Выделить всё

D:\Left 4 Dead\HM2_Project_v11.3 [Lighting]>makefile_hardmod_lite.bat
--------------------------------------------
Building hardmod.sp ...
--------------------------------------------
Скопировано файлов:         1.
SourcePawn Compiler 1.5.3-dev+3948
Copyright (c) 1997-2006, ITB CompuPhase, (C)2004-2008 AlliedModders, LLC

hardmod/lighting.inc(36) : error 017: undefined symbol "whiteColor"
hardmod/lighting.inc(250) : error 010: invalid function or declaration
hardmod/precache.inc(116) : error 021: symbol already defined: "PrecacheSounds"
hardmod.sp(1408) : warning 204: symbol is assigned a value that is never used: "IsCampaignDone"
hardmod.sp(1408 -- 1630) : warning 203: symbol is never used: "IsPlayerCPUAllowed"

3 Errors.
Не удается найти указанный файл.
--------------------------------------------
Built hardmod.sp as .smx
--------------------------------------------

Код: Выделить всё

new Handle:hm_lightning_damage1;
new Handle:hm_lightning_damage2;
new Handle:hm_lightning_todeath;
new Handle:hm_lightning_range;
new Handle:hm_lightning_life;

new Handle:hm_ammochance_lightningbox;

new g_sprite;
new Lightning[MAXPLAYERS+1][MAXPLAYERS+1];
new Float:AttackerTime[MAXPLAYERS+1];
new Victim[MAXPLAYERS+1];

#define LINGHNING2 "ambient/energy/zap1.wav"

public LightingBoxOnPluginStart()
{
	Version += 1;
	hm_ammochance_lightningbox = CreateConVar("hm_ammochance_lightningbox", "0", "", FCVAR_PLUGIN);
}

ShowEffectToPlayer(attacker, victim)
{
	decl Float:pos1[3];
	decl Float:pos2[3];
	GetClientEyePosition(victim, pos1);
	GetClientEyePosition(attacker, pos2);

	DamageEffects(victim, hm_lightning_damage1);
 
	new Float:life=0.2;
	new Float:width1=5.0;
 	
	ShowParticle(pos1, "electrical_arc_01_system", 0.5);		
	
	TE_SetupBeamPoints(pos1, pos2, g_sprite, 0, 0, 0, life, width1, width1, 1, 0.0,whiteColor, 0);
	TE_SendToAll();	
	EmitSoundToAll(LINGHNING2, 0, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, 100, _, pos1, NULL_VECTOR, false, 0.0);	
	ClientCommand(victim, "vocalize PlayerDeath");
}

public Action:ScanPlayer(Handle:timer,any:attacker)
{
	new Float:time=AttackerTime[attacker];	
	new victim=Victim[attacker];
	 
	if((GetEngineTime()-time)>GetConVarFloat(hm_lightning_life))
	{
		ClearLightning(attacker);
		return Plugin_Stop;
	}
	if(victim >0)
	{
		new v=SearchVictim(victim,attacker);
		if(v>0)
		{
			Victim[attacker]=v; 
			Lightning[attacker][v]=1;
			ShowEffectToPlayer(victim, v);
		}
		else if(v==0)
		{
			decl Float:pos[3];
			GetClientEyePosition(victim, pos);
			pos[2]-=15.0;
			ShowParticle(pos, "electrical_arc_01_system", 0.5);
			EmitSoundToAll(LINGHNING2, 0, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, 100, _, pos, NULL_VECTOR, false, 0.0);	
			if(GetConVarInt(hm_lightning_todeath)==1)
			{
				DamageEffects(victim, hm_lightning_damage2);
			}
			else if	(!IsPlayerIncapped(victim))
			{
				DamageEffects(victim, hm_lightning_damage2);
			}
			else if	(GetConVarInt(hm_lightning_todeath)==0)
			{
				ClearLightning(attacker);
			}
		}
		else if(v<0)
		{
			ClearLightning(attacker);
			return Plugin_Stop;
		}
		return Plugin_Continue;
	}
	else
	{
		ClearLightning(attacker);
		return Plugin_Stop;
	}
}

ClearLightning(attacker)
{
	for(new client = 1; client <= MaxClients; client++)
	{
		Lightning[attacker][client]=0;
	}
	Victim[attacker]=0;
	AttackerTime[attacker]=0.0;
}

SearchVictim(victim, attacker)
{
	new t=0;
	decl Float:pos1[3];
	decl Float:pos2[3];
	GetClientEyePosition(victim, pos1);
	new bool:left=false;
	new Float:range=GetConVarFloat(hm_lightning_range);
	for (new client=1; client<=MaxClients; client++)
	{
		if(IsClientInGame(client) && IsPlayerAlive(client))
		{
			if(Lightning[attacker][client]==0)
			{
				if(GetClientTeam(client)==2)left=true;
				GetClientEyePosition(client, pos2);
				new Float:d=GetVectorDistance(pos1, pos2);
				if(d<range)
				{
					new bool:visible=IfTwoPosVisible(pos1,pos2, 0);
					if(visible)
					{
						t=client;
						break;
					}
				}
			}
		}
	}
	
	if(!left)t=-1;
	return t;
}

public ShowParticle(Float:pos[3], String:particlename[], Float:time)
{
	new particle = CreateEntityByName("info_particle_system");
	if (IsValidEdict(particle))
	{
		TeleportEntity(particle, pos, NULL_VECTOR, NULL_VECTOR);
		DispatchKeyValue(particle, "effect_name", particlename);
		DispatchKeyValue(particle, "targetname", "particle");
		DispatchSpawn(particle);
		ActivateEntity(particle);
		AcceptEntityInput(particle, "start");
		CreateTimer(time, DeleteParticles, particle, TIMER_FLAG_NO_MAPCHANGE);
	} 
}

stock DamageEffects(target, Handle:damageconvar)
{
	decl String:damage[10];
	GetConVarString(damageconvar, damage, 10);
	decl String:N[20];
	Format(N, 20, "target%d", target);	
	new pointHurt = CreateEntityByName("point_hurt");	
	if(pointHurt<=0)return;
	DispatchKeyValue(target, "targetname", N);			
	DispatchKeyValue(pointHurt, "Damage", damage);				
	DispatchKeyValue(pointHurt, "DamageTarget", N);
	DispatchKeyValue(pointHurt, "DamageType", "8");			
	DispatchSpawn(pointHurt);									
	AcceptEntityInput(pointHurt, "Hurt"); 					
	AcceptEntityInput(pointHurt, "Kill"); 	
	RemoveEdict(pointHurt);
}

public Action:DeleteParticles(Handle:timer, any:particle)
{
	if (IsValidEntity(particle))
	{
		decl String:classname[64];
		GetEdictClassname(particle, classname, sizeof(classname));
		if (StrEqual(classname, "info_particle_system", false))
			{
				AcceptEntityInput(particle, "stop");
				AcceptEntityInput(particle, "kill");
				RemoveEdict(particle);
			}
	}
}

public AttachParticle(i_Ent, String:s_Effect[], Float:f_Origin[3])
{
	decl i_Particle;
	decl String:s_TargetName[32];
	i_Particle = CreateEntityByName("info_particle_system");
	
	if (IsValidEdict(i_Particle))
	{
		TeleportEntity(i_Particle, f_Origin, NULL_VECTOR, NULL_VECTOR);
		FormatEx(s_TargetName, sizeof(s_TargetName), "target%d", i_Ent);
		DispatchKeyValue(i_Particle, "targetname", s_TargetName);
		GetEntPropString(i_Ent, Prop_Data, "m_iName", s_TargetName, sizeof(s_TargetName));
		DispatchKeyValue(i_Particle, "parentname", s_TargetName);
		DispatchKeyValue(i_Particle, "effect_name", s_Effect);
		DispatchSpawn(i_Particle);
		SetVariantString(s_TargetName);
		AcceptEntityInput(i_Particle, "SetParent", i_Particle, i_Particle, 0);
		ActivateEntity(i_Particle);
		AcceptEntityInput(i_Particle, "Start");
	}
	return i_Particle;
}

bool:IfTwoPosVisible(Float:pos1[3], Float:pos2[3], self)
{
	new bool:r=true;
	new Handle:trace = TR_TraceRayFilterEx(pos2, pos1, MASK_SOLID, RayType_EndPoint, TraceRayDontHitSelfAndLive,self);
	if(TR_DidHit(trace))
	{
		r=false;
	}
 	CloseHandle(trace);
	return r;
}

public bool:TraceRayDontHitSelfAndLive(entity, mask, any:data)
{
	if(entity == data) 
	{
		return false; 
	}
	else if(entity>0 && entity<=MaxClients)
	{
		if(IsClientInGame(entity))
		{
			return false;
		}
	}
	return true;
}

stock bool:IsPlayerIncapped(client)
{
	if (GetEntProp(client, Prop_Send, "m_isIncapacitated", 1)) return true;
	return false;
}

public Action:Timer_ClearLightning(Handle:timer, any:attacker) 
{ 
	ClearLightning(attacker);
	return Plugin_Stop;
}

Добавить в precache.inc

public PrecacheOther()
{
	PrecacheParticle("electrical_arc_01_system");
}

public PrecacheSounds()
{
	PrecacheSound("ambient/energy/zap1.wav", true);
}
Никакого отношения к нацистским группам и направлениям не имею.

andreiii
Лейтенант
Лейтенант
Сообщения: 228
Зарегистрирован: 24.11.2011
Благодарил (а): 1 раз
Поблагодарили: 8 раз

#1995 Сообщение 11.11.2013, 17:56

Код: Выделить всё

#include <sourcemod>
#include <sdktools>

#define LINGHNING2 "ambient/energy/zap1.wav"

new Handle:l4d_lightning_damage1;
new Handle:l4d_lightning_damage2 ;
new Handle:l4d_lightning_todeath ;
new Handle:l4d_lightning_range;
new Handle:l4d_lightning_life;
new g_sprite;


new Lightning[MAXPLAYERS+1][MAXPLAYERS+1];
new Float:AttackerTime[MAXPLAYERS+1];
new Victim[MAXPLAYERS+1];

public Plugin:myinfo = 
{
	name = "test",
	author = "test",
	description = "test",
	version = "0.1",
	url = " "
}
public OnPluginStart()
{
	l4d_lightning_damage1 = CreateConVar("l4d_lightning_damage1", "30", "damage at first,[1, 100]int", FCVAR_PLUGIN);
	l4d_lightning_damage2 = CreateConVar("l4d_lightning_damage2", "5", "damage per second,[1, 10]int", FCVAR_PLUGIN);
	l4d_lightning_todeath = CreateConVar("l4d_lightning_todeath", "1", "0, do not damage palyer if icapped, 1, awalys damage to palyer", FCVAR_PLUGIN);
	l4d_lightning_range   = CreateConVar("l4d_lightning_range", "200.0", "lightning transfer range [300.0, -]", FCVAR_PLUGIN);
	l4d_lightning_life    = CreateConVar("l4d_lightning_life", "80", "lightning's life [30.0 -]", FCVAR_PLUGIN);
	RegAdminCmd("sm_lightningbox", Command_ligh, 8192, "Command lightningbox");
}

public Action:Command_ligh(client, args)
{
	if(args < 1)
	{
		PrintToChat(client, "[SM] Usage: sm_lightningbox <#userid|name>");
		return Plugin_Handled;
	}    

	decl String:arg1[65];
	GetCmdArg(1, arg1, sizeof(arg1));
	decl String:target_name[MAX_TARGET_LENGTH];
	decl target_list[MAXPLAYERS], target_count, bool:tn_is_ml;
	if ((target_count = ProcessTargetString(
		arg1,
		client,
		target_list,
		MAXPLAYERS,
		COMMAND_FILTER_ALIVE,
		target_name,
		sizeof(target_name),
			tn_is_ml)) <= 0)
	{
		ReplyToTargetError(client, target_count);
		return Plugin_Handled;
	}    

	for (new i = 0; i < target_count; i++)
	{
		ligh(target_list[i], client);
	}
	return Plugin_Handled;
}

ligh(client, sender)
{
	if(client == 0)
	{
		PrintToChat(sender, "[SM]Client is invalid");
		return;
	}
	if(client == -1)
	{
		PrintToChat(sender, "[SM]No targets!");
		return;
	}
	if(GetClientTeam(client) == 1)
	{
		PrintToChat(sender, "[SM]Cannot set on spectator's!");
		return;
		}
	if (!(IsValidEntity(client))) 
	{
		return;
	}
	if (!(GetClientTeam(client) == 2)) 
	{
		return;
	}
		new victim = client; 
		new attacker = client;
		if (!victim) return;
		if (!attacker) return;
		ClearLightning(attacker);
		Lightning[attacker][victim]=1;
		Lightning[attacker][attacker]=1;
		Victim[attacker]=victim;
		AttackerTime[attacker]=GetEngineTime();
		ShowEffectToPlayer(attacker, victim);
		CreateTimer(1.0, ScanPlayer, attacker, TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT);	 
}
new whiteColor[4]     = {255, 255, 255, 255};
ShowEffectToPlayer(attacker, victim)
{
	decl Float:pos1[3], pos2[3];
	GetClientEyePosition(victim, pos1);
	GetClientEyePosition(attacker, pos2);
	DamageEffect(victim, l4d_lightning_damage1);
	new Float:life=0.2;
	new Float:width1=10.0;
	width1=5.0;
	ShowParticle(pos1, "electrical_arc_01_system", 0.5);
	TE_SetupBeamPoints(pos1, pos2, g_sprite, 0, 0, 0, life, width1, width1, 1, 0.0,whiteColor, 0);
	TE_SendToAll();
	EmitSoundToAll(LINGHNING2, 0, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, 100, _, pos1, NULL_VECTOR, false, 0.0);	
	ClientCommand(victim, "vocalize PlayerDeath");
}
public Action:ScanPlayer(Handle:timer,any:attacker)
{ 
	new Float:time=AttackerTime[attacker];	
	new victim=Victim[attacker];
	 
	if((GetEngineTime()-time)>GetConVarFloat(l4d_lightning_life))
	{
		ClearLightning(attacker);
		return Plugin_Stop;
	}

 
	if(victim >0 && IsClientInGame(victim) && IsPlayerAlive(victim))
	{
		new v=SearchVictim(victim,attacker);
		if(v>0)
		{
			Victim[attacker]=v; 
			Lightning[attacker][v]=1;
			ShowEffectToPlayer(victim, v)
			
		}
		else if(v==0)
		{
			decl Float:pos[3];
			GetClientEyePosition(victim, pos);
			pos[2]-=15.0;
			ShowParticle(pos, "electrical_arc_01_system", 0.5);
	                EmitSoundToAll(LINGHNING2, 0, SNDCHAN_WEAPON, SNDLEVEL_TRAFFIC, SND_NOFLAGS, SNDVOL_NORMAL, 100, _, pos, NULL_VECTOR, false, 0.0);	
			if(GetConVarInt(l4d_lightning_todeath)==1)
			{
				DamageEffect(victim, l4d_lightning_damage2);
			}
			else if	(!(IsPlayerIncapped(victim) || IsPlayerGrapEdge(victim)))
			{
				DamageEffect(victim, l4d_lightning_damage2);
			}
		}
		else if(v<0)
		{
			ClearLightning(attacker);
			return Plugin_Stop;
		}
		return Plugin_Continue;
	}
	else
	{
		ClearLightning(attacker);
		return Plugin_Stop;
	}
 
}
ClearLightning(attacker)
{
	for(new client = 1; client <= MaxClients; client++)
	{
		Lightning[attacker][client]=0;
	}
	Victim[attacker]=0;
	AttackerTime[attacker]=0.0;
	//PrintToChatAll("%N finally", attacker);
}
SearchVictim(victim, attacker)
{
	new t=0;
	decl Float:pos1[3], pos2[3];
	GetClientEyePosition(victim, pos1);
	new bool:left=false;
	new Float:range=GetConVarFloat(l4d_lightning_range);
	for(new client = 1; client <= MaxClients; client++)
	{
		if(IsClientInGame(client) && IsPlayerAlive(client) )
		{
			
			if(Lightning[attacker][client]==0 )
			{
				if(GetClientTeam(client)==2)left=true;
				GetClientEyePosition(client, pos2);
				new Float:d=GetVectorDistance(pos1, pos2)
				if(d<range)
				{
					new bool:ok=IfTwoPosVisible(pos1,pos2, 0);
					if(ok)
					{
						t=client;
						break;
					}
				}
			}
		}
	}
	
	if(!left)t=-1;
	return t;
}


public ShowParticle(Float:pos[3], String:particlename[], Float:time)
{
 new particle = CreateEntityByName("info_particle_system");
 if (IsValidEdict(particle))
 {
		TeleportEntity(particle, pos, NULL_VECTOR, NULL_VECTOR);
		DispatchKeyValue(particle, "effect_name", particlename);
		DispatchKeyValue(particle, "targetname", "particle");
		DispatchSpawn(particle);
		ActivateEntity(particle);
		AcceptEntityInput(particle, "start");
		CreateTimer(time, DeleteParticles, particle, TIMER_FLAG_NO_MAPCHANGE);
 } 
}
 
public PrecacheParticle(String:particlename[])
{
 new particle = CreateEntityByName("info_particle_system");
 if (IsValidEdict(particle))
 {
		DispatchKeyValue(particle, "effect_name", particlename);
		DispatchKeyValue(particle, "targetname", "particle");
		DispatchSpawn(particle);
		ActivateEntity(particle);
		AcceptEntityInput(particle, "start");
		CreateTimer(0.01, DeleteParticles, particle, TIMER_FLAG_NO_MAPCHANGE);
 } 
}

public Action:DeleteParticles(Handle:timer, any:particle)
{
	 if (IsValidEntity(particle))
	 {
		 decl String:classname[64];
		 GetEdictClassname(particle, classname, sizeof(classname));
		 if (StrEqual(classname, "info_particle_system", false))
			{
				AcceptEntityInput(particle, "stop");
				AcceptEntityInput(particle, "kill");
				RemoveEdict(particle);
			}
	 }
}
public AttachParticle(i_Ent, String:s_Effect[], Float:f_Origin[3])
{
	decl i_Particle, String:s_TargetName[32]
	
	i_Particle = CreateEntityByName("info_particle_system")
	
	if (IsValidEdict(i_Particle))
	{
		TeleportEntity(i_Particle, f_Origin, NULL_VECTOR, NULL_VECTOR)
		FormatEx(s_TargetName, sizeof(s_TargetName), "target%d", i_Ent)
		DispatchKeyValue(i_Particle, "targetname", s_TargetName)
		GetEntPropString(i_Ent, Prop_Data, "m_iName", s_TargetName, sizeof(s_TargetName))
		DispatchKeyValue(i_Particle, "parentname", s_TargetName)
		DispatchKeyValue(i_Particle, "effect_name", s_Effect)
		DispatchSpawn(i_Particle)
		SetVariantString(s_TargetName)
		AcceptEntityInput(i_Particle, "SetParent", i_Particle, i_Particle, 0)
		ActivateEntity(i_Particle)
		AcceptEntityInput(i_Particle, "Start")
	}
	return i_Particle
}
IfTwoPosVisible(Float:pos1[3], Float:pos2[3], self)
{
	new bool:r=true;
	new Handle:trace = TR_TraceRayFilterEx(pos2, pos1, MASK_SOLID, RayType_EndPoint, TraceRayDontHitSelfAndLive,self);
	if(TR_DidHit(trace))
	{
		r=false;
	}
 	CloseHandle(trace);
	return r;
}
public bool:TraceRayDontHitSelfAndLive(entity, mask, any:data)
{
	if(entity == data) 
	{
		return false; 
	}
	else if(entity>0 && entity<=MaxClients)
	{
		if(IsClientInGame(entity))
		{
			return false;
		}
	}
	return true;
}
stock DamageEffect(target, Handle:damageconvar)
{
	decl String:damage[10];
	GetConVarString(damageconvar, damage, 10);
	decl String:N[20];
	Format(N, 20, "target%d", target);	
	new pointHurt = CreateEntityByName("point_hurt");	
	if(pointHurt<=0)return;
	DispatchKeyValue(target, "targetname", N);			
	DispatchKeyValue(pointHurt, "Damage", damage);				
	DispatchKeyValue(pointHurt, "DamageTarget", N);
	DispatchKeyValue(pointHurt, "DamageType", "8");			
	DispatchSpawn(pointHurt);									
	AcceptEntityInput(pointHurt, "Hurt"); 					
	AcceptEntityInput(pointHurt, "Kill"); 	
	RemoveEdict(pointHurt);
 	
}
public OnMapStart()
{
	g_sprite = PrecacheModel("materials/sprites/laserbeam.vmt");		
	PrecacheParticle("electrical_arc_01_system");
	PrecacheSound(LINGHNING2, true);
}
bool:IsPlayerIncapped(client)
{
	if (GetEntProp(client, Prop_Send, "m_isIncapacitated", 1)) return true;
 	return false;
}
bool:IsPlayerGrapEdge(client)
{
 	if (GetEntProp(client, Prop_Send, "m_isHangingFromLedge", 1))return true;
	return false;
}

Ответить Вложения 3