Нужна помощь с плагином для сорсмода

Обсуждаем все, что относится к выделенным серверам *NIX (Unix, Linux) и Windows
Ответить
Сообщение
Автор
pavlin09
Лейтенант
Лейтенант
Сообщения: 102
Зарегистрирован: 14.07.2008

#1 Сообщение 19.06.2011, 22:52

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

#include <sourcemod>
#include <sdktools_functions>
#include <sdktools>
#include <hacks>

#define VERSION "1.0"

#define GREEN                0x04

new Handle:pistol_Switch;
new String:Weapon[60];
new Handle:kLIMIT;
new gRestrict[MAXPLAYERS+1];
new zRestrict[MAXPLAYERS+1];
new Count[MAXPLAYERS+1];
new bool: pistol_aRestrict[MAXPLAYERS+1];

public Plugin:myinfo = 
{
	name = "Pistols for zombie",
	author = "TPOLI,KUU[B/IKCM]",
	description = "Give pistols zombie",
	version = VERSION,
	url = "www.sourcemod.net"
};

public OnPluginStart()
{
	pistol_Switch = CreateConVar("pistols_on","1","Turns the plugin on and off 1/0",FCVAR_NOTIFY);
	kLIMIT = CreateConVar("limit_for_pistols", "3", "Max amount of kill for pistol");
	HookEvent("player_death",DeathEvent);
	HookEvent("weapon_fire",WeaponEvent);
	HookEvent("player_spawn", PlayerSpawn);
}

public DeathEvent(Handle:event,const String:name[],bool:dontBroadcast)
{
	GetEventString(event,"weapon",Weapon,60);
	new clientid = GetEventInt(event,"attacker");
	new client = GetClientOfUserId(clientid);

	if(StrEqual(Weapon,"zombie_claws_of_death")== true && GetConVarInt(pistol_Switch)== 1)
	{
		new count = Count[client];
		new limit = GetConVarInt(kLIMIT);

		if (count < limit)
		{
			Count[client]++;
		}
		else
		{
			ClientHookUse(client);
			ClientHookUse2(client);
			GivePlayerItem(client, "weapon_elite");
			ClientUnHookUse(client);
			Count[client] = 0;
			pistol_aRestrict[client] = true;
		}
	}
}

public WeaponEvent(Handle:event,const String:name[],bool:dontBroadcast)
{
	GetEventString(event,"weapon",Weapon,30);
	new clientid = GetEventInt(event,"userid");
	new client = GetClientOfUserId(clientid);

	if(StrEqual(Weapon,"elite")== true && pistol_aRestrict[client] == true)
	{
		FakeClientCommandEx(client, "drop");
		pistol_aRestrict[client] = false;
		ClientUnHookUse2(client);
		GivePlayerItem(client, "weapon_knife");
	}else if(StrEqual(Weapon,"elite")== true && GetClientHealth(client) > 100)
	{
		FakeClientCommandEx(client, "drop");
		pistol_aRestrict[client] = false;
		ClientUnHookUse2(client);
		GivePlayerItem(client, "weapon_knife");
	}
}

public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
	new index = GetClientOfUserId(GetEventInt(event, "userid"));
	Count[index] = 1;
	pistol_aRestrict[index] = false;
}


//*****************************************************************************************************************************

public Weapon_CanUse(client, weapon, dummy1, dummy2, dummy3, dummy4)
{
	new String:weaponname[32];
	GetEdictClassname(weapon, weaponname, sizeof(weaponname));
    
	ReplaceString(weaponname, sizeof(weaponname), "weapon_", "");
    
	if (StrEqual(weaponname, "elite"))
	{
		return 1;
	}
    
	return Hacks_Continue;
}

ClientHookUse(client)
{
	gRestrict[client] = Hacks_Hook(client, HACKS_HTYPE_WEAPON_CANUSE, Weapon_CanUse, false);
}

ClientHookUse2(client)
{
	zRestrict[client] = Hacks_Hook(client, HACKS_HTYPE_WEAPON_CANSWITCHTO, Weapon_CanUse, false);
}

ClientUnHookUse(client)
{
	Hacks_Unhook(gRestrict[client]);
}

ClientUnHookUse2(client)
{
	Hacks_Unhook(zRestrict[client]);
}

public OnClientDisconnect(client)
{
	if(IsClientInGame(client)== true)
	{
		ClientHookUse2(client);
	}
}

public bool:OnClientConnect(client)
{
	if(IsClientInGame(client)== true)
	{
		ClientHookUse2(client);
	}
	return true;
}
Данный плагин должен выдавать пистолеты зомбям (на обычном зомбимоде 2.0.0 V, например), после заражения трех человечков. Зомбик может сделать один выстрел (если попадет в человечка, то заражает его), после чего пистолеты выкидываются.

Проблема в следующем: Если сервак только что запущен то как правило все работает отлично, после нескольких смен карты возможны глюки: либо сервер падает в течение 30 сек после начала новой карты, либо зомбик получает пистульки, но не может их выбрать, либо некоторые из людей спаунятся и не могут воспользоваться ни одним оружием (т.е. бегают с расставленными в стороны руками), хотя могут его купить и оно на них будет висеть.

В общем, если кто шарит в сорсмоде, подскажите, пожалуйста, что можно исправить.

kadet89
Майор
Майор
Сообщения: 557
Зарегистрирован: 26.12.2006

#2 Сообщение 22.06.2011, 00:59

Скрипт очень простой, но написан неоптимально. Handle не нужны, используй обычные. анхуки помоему сейчас уже см сам грамотно делает. #include <hacks> вот эта штука сомнительная, я ее никогда не использую. Хуки и анхуки вообще мутное дело, часто происходят сбои из-за смен id и тогда могут происходить невероятные вещи

pavlin09
Лейтенант
Лейтенант
Сообщения: 102
Зарегистрирован: 14.07.2008

#3 Сообщение 22.06.2011, 02:31

kadet89 писал(а):#include <hacks> вот эта штука сомнительная
Скрипт делал на основе зомбирелоада, который сам использовал эти хаки. Вроде люди на таких релоадах играли как-то. Хотя я не прочь избавиться от них. Сделать через ту же геймдату, но не знаю как. Скрипты в основном пишу, выдирая кусочки из похожих или чуть их подправляя, естественно что они не оптимальны. Но если другие худо бедно работают, то этот глючит и сервак роняет. Хотелось бы довести его до ума. Вдруг кто знающий попадется, кого заинтересует этот скрипт.

Аватара пользователя
danyas
Нович0к
Нович0к
Сообщения: 10
Зарегистрирован: 23.04.2011
Откуда: Киев

#4 Сообщение 06.11.2011, 23:59

Ребят оффтоп но очень надо. Мне надо плагин который будет стаить различные квары. (ну автоматом ставит определенный квар(типу ркон лок(не позволяет сменить квар)))

:offtopic: :dash: : %-) нужен исходник скиньте в скайпу danyas1998
Изображение

Ответить