Вопросы по модулями Shop

smoke96

Участник
Сообщения
1,134
Реакции
175
Прошу проверить код на правильность

Вот код . Это для шопа. Купил и когда стреляешь в голову то она взрывается. Компилируется без ошибок , но проверить пока нет возможности. Прошу проверить, все ли у меня правильно.
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdktools_functions>
#include <shop>

#define EXPLODE_SOUND	"ambient/explosions/explode_8.wav"
#define CATEGORY	"stuff"

new bool:g_bHasBB[MAXPLAYERS+1];
new Float:iNormal[3] = { 0.0, 0.0, 1.0 };
new g_ExplosionSprite;
new g_SmokeSprite;
new Handle:g_hPrice,
	Handle:g_hSellPrice,
	Handle:g_hDuration,
	ItemId:id;

public Plugin:myinfo =
{
	name = "[Shop] Boom Bullet",
	author = "Smoke",
	version = "1.0"
};

public OnPluginStart()
{
	HookEvent("player_death", Boom_Head);

	g_hPrice = CreateConVar("sm_shop_boombullet_price", "10000", "Стоимость покупки взрывной пули.");
	HookConVarChange(g_hPrice, OnConVarChange);
	
	g_hSellPrice = CreateConVar("sm_shop_boombullet_sellprice", "5000", "Стоимость продажи взрывной пули.");
	HookConVarChange(g_hPrice, OnConVarChange);
	
	g_hDuration = CreateConVar("sm_shop_boombullet_duration", "2592000", "Длительность взрывной пули в секундах.");
	HookConVarChange(g_hDuration, OnConVarChange);

	AutoExecConfig(true, "shop_boombullet", "shop");
	
	if (Shop_IsStarted()) Shop_Started();
}

public OnMapStart() 
{
	PrecacheSound(EXPLODE_SOUND, true);
	g_ExplosionSprite = PrecacheModel("sprites/blueglow2.vmt");
	g_SmokeSprite = PrecacheModel("sprites/steam1.vmt");
}

public OnConVarChange(Handle:hCvar, const String:oldValue[], const String:newValue[])
{
	if(id != INVALID_ITEM)
	{
		if(hCvar == g_hPrice) Shop_SetItemPrice(id, GetConVarInt(hCvar));
		else if(hCvar == g_hSellPrice) Shop_SetItemSellPrice(id, GetConVarInt(hCvar));
		else if(hCvar == g_hDuration) Shop_SetItemValue(id, GetConVarInt(hCvar));
	}
}

public OnPluginEnd() Shop_UnregisterMe();

public Shop_Started()
{
	new CategoryId:category_id = Shop_RegisterCategory(CATEGORY, "Дополнительно", "");
	if (Shop_StartItem(category_id, "boombullet"))
	{
		Shop_SetInfo("Взрывная пуля [HS]", "", GetConVarInt(g_hPrice), GetConVarInt(g_hSellPrice), Item_Togglable, GetConVarInt(g_hDuration));
		Shop_SetCallbacks(OnItemRegistered, OnItemUsed);
		Shop_EndItem();
	}
}

public OnItemRegistered(CategoryId:category_id, const String:category[], const String:item[], ItemId:item_id) id = item_id;

public ShopAction:OnItemUsed(iClient, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[], bool:isOn, bool:elapsed)
{
	if (isOn || elapsed)
	{
		g_bHasBB[iClient] = false;
		return Shop_UseOff;
	}

	g_bHasBB[iClient] = true;

	return Shop_UseOn;
}

public OnClientPostAdminCheck(iClient) 
{
	g_bHasBB[iClient] = false;
}

public Action:Boom_Head(Handle:event, const String:name[], bool:dontBroadcast)
{
	new iClient = GetClientOfUserId(GetEventInt(event, "userid"));
	if(g_bHasBB[iClient] && iClient)
	{
		new victim = GetClientOfUserId(GetEventInt(event, "userid"));
		new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));

		if(victim == attacker)
		{
			return Plugin_Handled;
		}
		
		new Float:iVec[3];
		GetClientAbsOrigin(victim, Float:iVec);
		
		if(GetEventBool(event, "headshot"))
		{
			TE_SetupExplosion(iVec, g_ExplosionSprite, 5.0, 1, 0, 50, 40, iNormal);
			TE_SendToAll();
			
			TE_SetupSmoke(iVec, g_SmokeSprite, 10.0, 3);
			TE_SendToAll();
	
			EmitAmbientSound(EXPLODE_SOUND, iVec, victim, SNDLEVEL_NORMAL);
		}
	}
	return Plugin_Continue;
}
Проверил, сам нашел ошибку, я сделал всё наоборот , т.е я купил в шопе и если меня убивают то моя голова взрывается. Как исправить :?
 
Последнее редактирование модератором:

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: Прошу проверить код на правильность

По исходному коду правильнее так:
PHP:
public Boom_Head(Handle:event, String:name[], bool:dontBroadcast)
{
    new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if(g_bHasBB[attacker] && attacker)
    {
        new victim = GetClientOfUserId(GetEventInt(event, "userid"));
        if(victim != attacker)
        {
            decl Float:iVec[3];
			GetClientAbsOrigin(victim, Float:iVec);
			if(GetEventBool(event, "headshot"))
			{
				TE_SetupExplosion(iVec, g_ExplosionSprite, 5.0, 1, 0, 50, 40, iNormal);
				TE_SendToAll();
				
				TE_SetupSmoke(iVec, g_SmokeSprite, 10.0, 3);
				TE_SendToAll();
				
				EmitAmbientSound(EXPLODE_SOUND, iVec, victim, SNDLEVEL_NORMAL);
			}
        }
    }
}
Это должно исправить ошибку? -> Проверил, сам нашел ошибку, я сделал всё наоборот , т.е я купил в шопе и если меня убивают то моя голова взрывается. Как исправить :?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Re: Прошу проверить код на правильность

Оффтоп Ещё раз посмотри мой код - подправил чуток, меньше сервер грузить станет.
Думаю, хедшот самого себя не реален, а потому вообще можно так:
PHP:
public Boom_Head(Handle:event, String:name[], bool:dontBroadcast) 
{ 
    if(GetEventBool(event, "headshot") && g_bHasBB[GetClientOfUserId(GetEventInt(event, "attacker"))])
	{
		decl Float:iVec[3];
		new victim = GetClientOfUserId(GetEventInt(event, "userid"));
		GetClientAbsOrigin(victim, Float:iVec);

		TE_SetupExplosion(iVec, g_ExplosionSprite, 5.0, 1, 0, 50, 40, iNormal);
		TE_SendToAll();

		TE_SetupSmoke(iVec, g_SmokeSprite, 10.0, 3);
		TE_SendToAll();

		EmitAmbientSound(EXPLODE_SOUND, iVec, victim, SNDLEVEL_NORMAL);
	}
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #46
B1g, прошу в дальнейшем все свои вопросы задавать в этой теме, а не создавать новые.
 

Arthur Don

Участник
Сообщения
1,696
Реакции
256
B1g, в плагине перезарядки есть баг с авп, когда перезаредился не работает зум несколько секунд. И не перезарежает дробовики :)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

smoke96

Участник
Сообщения
1,134
Реакции
175
Подскажите как сделать проверку на суицид и убийство миром? Ну то есть если тебя убил мир или ты суциднул , то действие не выполниться, а если тебя убил другой игрок то действие выполниться.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
PHP:
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
if(attacker == 0)
{
//Код.
}
проверку на суицид
PHP:
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
new victim = GetClientOfUserId(GetEventInt(event, "userid"));
if(attacker == victim)
{
//Код.
}
 
Последнее редактирование:

smoke96

Участник
Сообщения
1,134
Реакции
175
PHP:
if(attacker == 0)
PHP:
if(attacker == victim)
С последним... Например, убил сам себя гранатой, то будет справедливо. А если через консоль (команда kill), то не помню, надо проверить.
Что-то не врублюсь, как всегда )) Ну вообщем смотри вот код эффекта тесла.
PHP:
public Lightning_EnergySplash(client, Float:fVec[3]) 
{
	new tesla = CreateEntityByName("point_tesla");  //Он делается с помощью создания entity объекта "point_tesla"
	DispatchKeyValue(tesla, "beamcount_min", "5");  // Минимальное Количество всплесков
	DispatchKeyValue(tesla, "beamcount_max", "10");  //Максимальное
	DispatchKeyValue(tesla, "lifetime_min", "0.2");  //Минимальное время жизни
	DispatchKeyValue(tesla, "lifetime_max", "0.5");  //Максимальное время жизни
	DispatchKeyValue(tesla, "m_flRadius", "100.0");  // Радиус
	DispatchKeyValue(tesla, "m_SoundName", "DoSpark");  //Звук искр
	DispatchKeyValue(tesla, "texture", "sprites/physbeam.vmt");  // Текстура спрайта
	DispatchKeyValue(tesla, "m_Color", "255 255 255");  //Цвет
	DispatchKeyValue(tesla, "thick_min", "1.0");  
	DispatchKeyValue(tesla, "thick_max", "10.0");
	DispatchKeyValue(tesla, "interval_min", "0.1"); 
	DispatchKeyValue(tesla, "interval_max", "0.2"); 
              
	DispatchSpawn(tesla); //Спавним наш "point_tesla"
	TeleportEntity(tesla, fVec, NULL_VECTOR, NULL_VECTOR); //И телепортируем на позицию прицела
     
	AcceptEntityInput(tesla, "TurnOn"); 
	AcceptEntityInput(tesla, "DoSpark");
}
Как сделать так чтобы он выполнялся только когда игрока убил другой игрок? Ну т.е на игроке которого убили появляется тесла. А при суициде и убийством миром код не выполнялся.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
вообщем смотри вот код эффекта тесла
Начинать надо с события player_death:
PHP:
//Встроенное глобальное событие, функция которого - единождый вызов при полной инициализации плагина.
public OnPluginStart()
{
	//Отлавливаем общее событие "Убийства".
	HookEvent("player_death", Event_PlayerDeath);
	//Прочий код.
}

//Функция обратного вызова, срабатывающая при любом убийстве. 
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	//Получаем индекс игрока-убийцы attacker.
	new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
	//Фильтр убийства игровым миром: "игрок"-убийца attacker не может быть равен нулю.
	if(attacker)
	{
		//Получаем индекс игрока-жертвы victim (убитого).
		new victim = GetClientOfUserId(GetEventInt(event, "userid"));
		//Фильтрация самоубийства: игрок-убийца attacker не может быть равен игроку-жертве victim (т.е. самому себе).
		if(attacker != victim)
		{
			//Код Теслы и т.п.
		}
	}
}
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Прости за мою тупость( Просто ответь если игрока убьет мир , то тесла не случиться?
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Нет. Оффтоп

Спасибо!

Добавлено через 24 минуты
Алмаз, вот смотри , сделал так
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdktools_functions>
#include <shop>

#define CATEGORY	"stuff"

new bool:g_bHasEE[MAXPLAYERS+1];
new Float:fVec[3];
new Handle:g_hPrice,
	Handle:g_hSellPrice,
	Handle:g_hDuration,
	ItemId:id;

public Plugin:myinfo =
{
	name = "[Shop] Electro Effect",
	author = "Smoke",
	version = "1.0"
};

public OnPluginStart()
{
    HookEvent("player_death", Event_ElectroEffect);

	g_hPrice = CreateConVar("sm_shop_electroeffect_price", "7000", "Стоимость покупки электро эффекта.");
	HookConVarChange(g_hPrice, OnConVarChange);
	
	g_hSellPrice = CreateConVar("sm_shop_electroeffect_sellprice", "3500", "Стоимость продажи электро эффекта.");
	HookConVarChange(g_hPrice, OnConVarChange);
	
	g_hDuration = CreateConVar("sm_shop_electroeffect_duration", "2592000", "Длительность электро эффекта в секундах.");
	HookConVarChange(g_hDuration, OnConVarChange);

	AutoExecConfig(true, "shop_electroeffect", "shop");
	
	if (Shop_IsStarted()) Shop_Started();
}

public OnConVarChange(Handle:hCvar, const String:oldValue[], const String:newValue[])
{
	if(id != INVALID_ITEM)
	{
		if(hCvar == g_hPrice) Shop_SetItemPrice(id, GetConVarInt(hCvar));
		else if(hCvar == g_hSellPrice) Shop_SetItemSellPrice(id, GetConVarInt(hCvar));
		else if(hCvar == g_hDuration) Shop_SetItemValue(id, GetConVarInt(hCvar));
	}
}

public OnPluginEnd() Shop_UnregisterMe();

public Shop_Started()
{
	new CategoryId:category_id = Shop_RegisterCategory(CATEGORY, "Дополнительно", "");
	if (Shop_StartItem(category_id, "electroeffect"))
	{
		Shop_SetInfo("Электро-эффект", "", GetConVarInt(g_hPrice), GetConVarInt(g_hSellPrice), Item_Togglable, GetConVarInt(g_hDuration));
		Shop_SetCallbacks(OnItemRegistered, OnItemUsed);
		Shop_EndItem();
	}
}

public OnItemRegistered(CategoryId:category_id, const String:category[], const String:item[], ItemId:item_id) id = item_id;

public ShopAction:OnItemUsed(iClient, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[], bool:isOn, bool:elapsed)
{
	if (isOn || elapsed)
	{
		g_bHasEE[iClient] = false;
		return Shop_UseOff;
	}

	g_bHasEE[iClient] = true;

	return Shop_UseOn;
}

public OnClientPostAdminCheck(iClient) 
{
	g_bHasEE[iClient] = false;
}

//Функция обратного вызова, срабатывающая при любом убийстве. 
public Event_ElectroEffect(Handle:event, const String:name[], bool:dontBroadcast)
{
    //Получаем индекс игрока-убийцы attacker.
    new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    //Фильтр убийства игровым миром: "игрок"-убийца attacker не может быть равен нулю.
    if(g_bHasEE[attacker] && attacker)
    {
        //Получаем индекс игрока-жертвы victim (убитого).
        new victim = GetClientOfUserId(GetEventInt(event, "userid"));
        //Фильтрация самоубийства: игрок-убийца attacker не может быть равен игроку-жертве victim (т.е. самому себе).
        if(attacker != victim)
        {
            //Код Теслы и т.п.
			new tesla = CreateEntityByName("point_tesla");  //Он делается с помощью создания entity объекта "point_tesla" 
			DispatchKeyValue(tesla, "beamcount_min", "5");  // Минимальное Количество всплесков 
			DispatchKeyValue(tesla, "beamcount_max", "10");  //Максимальное 
			DispatchKeyValue(tesla, "lifetime_min", "0.2");  //Минимальное время жизни 
			DispatchKeyValue(tesla, "lifetime_max", "0.5");  //Максимальное время жизни 
			DispatchKeyValue(tesla, "m_flRadius", "100.0");  // Радиус 
			DispatchKeyValue(tesla, "m_SoundName", "DoSpark");  //Звук искр 
			DispatchKeyValue(tesla, "texture", "sprites/physbeam.vmt");  // Текстура спрайта 
			DispatchKeyValue(tesla, "m_Color", "255 255 255");  //Цвет 
			DispatchKeyValue(tesla, "thick_min", "1.0");   
			DispatchKeyValue(tesla, "thick_max", "10.0"); 
			DispatchKeyValue(tesla, "interval_min", "0.1");  
			DispatchKeyValue(tesla, "interval_max", "0.2");  
               
			DispatchSpawn(tesla); //Спавним наш "point_tesla" 
			TeleportEntity(tesla, fVec, NULL_VECTOR, NULL_VECTOR); //И телепортируем на позицию прицела 
      
			AcceptEntityInput(tesla, "TurnOn");  
			AcceptEntityInput(tesla, "DoSpark"); 
        }
    }
}
Но при убийстве игрока не появляется эффект :( компилируется без ошибок :(
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #57
B1g, 1.
PHP:
  if(g_bHasEE[attacker] && attacker)
Поменяй местами.

2.
PHP:
new Float:fVec[3];
Зачем глобальнО?
3. Не получил коорднаты жертвы.

PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdktools_functions>
#include <shop>

#define CATEGORY	"stuff"

new bool:g_bHasEE[MAXPLAYERS+1];

new Handle:g_hPrice,
	Handle:g_hSellPrice,
	Handle:g_hDuration,
	ItemId:id;

public Plugin:myinfo =
{
	name = "[Shop] Electro Effect",
	author = "Smoke",
	version = "1.0"
};

public OnPluginStart()
{
    HookEvent("player_death", Event_ElectroEffect);

	g_hPrice = CreateConVar("sm_shop_electroeffect_price", "7000", "Стоимость покупки электро эффекта.");
	HookConVarChange(g_hPrice, OnConVarChange);
	
	g_hSellPrice = CreateConVar("sm_shop_electroeffect_sellprice", "3500", "Стоимость продажи электро эффекта.");
	HookConVarChange(g_hPrice, OnConVarChange);
	
	g_hDuration = CreateConVar("sm_shop_electroeffect_duration", "2592000", "Длительность электро эффекта в секундах.");
	HookConVarChange(g_hDuration, OnConVarChange);

	AutoExecConfig(true, "shop_electroeffect", "shop");
	
	if (Shop_IsStarted()) Shop_Started();
}

public OnConVarChange(Handle:hCvar, const String:oldValue[], const String:newValue[])
{
	if(id != INVALID_ITEM)
	{
		if(hCvar == g_hPrice) Shop_SetItemPrice(id, GetConVarInt(hCvar));
		else if(hCvar == g_hSellPrice) Shop_SetItemSellPrice(id, GetConVarInt(hCvar));
		else if(hCvar == g_hDuration) Shop_SetItemValue(id, GetConVarInt(hCvar));
	}
}

public OnPluginEnd() Shop_UnregisterMe();

public Shop_Started()
{
	new CategoryId:category_id = Shop_RegisterCategory(CATEGORY, "Дополнительно", "");
	if (Shop_StartItem(category_id, "electroeffect"))
	{
		Shop_SetInfo("Электро-эффект", "", GetConVarInt(g_hPrice), GetConVarInt(g_hSellPrice), Item_Togglable, GetConVarInt(g_hDuration));
		Shop_SetCallbacks(OnItemRegistered, OnItemUsed);
		Shop_EndItem();
	}
}

public OnItemRegistered(CategoryId:category_id, const String:category[], const String:item[], ItemId:item_id) id = item_id;

public ShopAction:OnItemUsed(iClient, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[], bool:isOn, bool:elapsed)
{
	if (isOn || elapsed)
	{
		g_bHasEE[iClient] = false;
		return Shop_UseOff;
	}

	g_bHasEE[iClient] = true;

	return Shop_UseOn;
}

public OnClientPostAdminCheck(iClient) 
{
	g_bHasEE[iClient] = false;
}

//Функция обратного вызова, срабатывающая при любом убийстве. 
public Event_ElectroEffect(Handle:event, const String:name[], bool:dontBroadcast)
{
    //Получаем индекс игрока-убийцы attacker.
    new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    //Фильтр убийства игровым миром: "игрок"-убийца attacker не может быть равен нулю.
    if(attacker && g_bHasEE[attacker])
    {
        //Получаем индекс игрока-жертвы victim (убитого).
        new victim = GetClientOfUserId(GetEventInt(event, "userid"));
        //Фильтрация самоубийства: игрок-убийца attacker не может быть равен игроку-жертве victim (т.е. самому себе).
        if(attacker != victim)
        {
            //Код Теслы и т.п.
			decl Float:fVec[3];
			GetClientAbsOrigin(victim, fVec);
			fVec[2] += 20.0;
			new tesla = CreateEntityByName("point_tesla");  //Он делается с помощью создания entity объекта "point_tesla" 
			DispatchKeyValue(tesla, "beamcount_min", "5");  // Минимальное Количество всплесков 
			DispatchKeyValue(tesla, "beamcount_max", "10");  //Максимальное 
			DispatchKeyValue(tesla, "lifetime_min", "0.2");  //Минимальное время жизни 
			DispatchKeyValue(tesla, "lifetime_max", "0.5");  //Максимальное время жизни 
			DispatchKeyValue(tesla, "m_flRadius", "100.0");  // Радиус 
			DispatchKeyValue(tesla, "m_SoundName", "DoSpark");  //Звук искр 
			DispatchKeyValue(tesla, "texture", "sprites/physbeam.vmt");  // Текстура спрайта 
			DispatchKeyValue(tesla, "m_Color", "255 255 255");  //Цвет 
			DispatchKeyValue(tesla, "thick_min", "1.0");   
			DispatchKeyValue(tesla, "thick_max", "10.0"); 
			DispatchKeyValue(tesla, "interval_min", "0.1");  
			DispatchKeyValue(tesla, "interval_max", "0.2");  
               
			DispatchSpawn(tesla); //Спавним наш "point_tesla" 
			TeleportEntity(tesla, fVec, NULL_VECTOR, NULL_VECTOR); //И телепортируем на позицию прицела 
      
			AcceptEntityInput(tesla, "TurnOn");  
			AcceptEntityInput(tesla, "DoSpark"); 
        }
    }
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Поменяй местами.
Зачем? У нас что, мир когда-нибудь примет значение true? Достаточно просто:
if(g_bHasEE[attacker]) и всё.
И, кстати, вероятность false для g_bHasEE[attacker] гораздо выше, нежели attacker равный 0. Так, как у него - правильней, раз уж на то пошло.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #59
AlmazON, а ему же надо чтобы от мира тоже была... не читал просто посты раньше.
Так будет вернее:
PHP:
if((attacker && g_bHasEE[attacker]) || attacker == 0)
Потому что g_bHasEE[attacker] для attacker == 0 всегда false
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
надо чтобы от мира тоже была
Оффтоп Нет, наоборот Оффтоп:
если тебя убил мир или ты суциднул , то действие не выполниться, а если тебя убил другой игрок то действие выполниться
У нас что, мир когда-нибудь примет значение true?
Если SHOP не установит g_bHasEE[0] = true, то защита от игрового мира работает автоматически. Дальше этой же проверки код не пройдёт.
Оффтоп
 
Сверху Снизу