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

smoke96

Участник
Сообщения
1,134
Реакции
175
В общем пишу модули скромненькие (по своим силам) для шопа от Фроза. Так вот написал модуль Полет , ну т.е. пока игрок жмёт на E то он летит , как только E отпускается то игрок падает на землю. Так вот , все работает , но я хочу исправить 1 варнинг (Warning 213: tag mismatch.)
Предупреждение выдает в строке выделенной жирным.

PHP:
OnButtonUseReleased(iClient)
{
	{
		SetEntityMoveType(iClient, MOVETYPE_WALK);
	}
	return Plugin_Handled;
}

return Plugin_Handled;

Подскажите как исправить? Весь код модуля дам только людям знающим , а то как всегда сольют всё в паблик. Спасибо заранее!
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Fly

Оно здесь и не нужно, просто убери.

Спасибо. Все в норме . А не подскажешь как сделать чтобы когда игрок отпустил E , и упал с высоты у него хп не отнялись? Пытался этот плагин -> http://hlmod.ru/forum/plaginy-dlya-sourcemod/2048-no-fall-damage-v1-0-a.html в свой пихнуть , не получилось.
 

AlmazON

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

Пытался этот плагин
В общем-то, это лучший вариант. Только там есть конкретное указание от "высоты", иначе можно сделать вообще запрет урона от всего сервера.
Вообще, так то у тебя получится, что урон с высоты всегда будет отключён. Ты же хочешь лишь на время (таймером тоже не очень)?
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Fly

А как в том плагине убрать вообще ограничение высоты? Просто чтобы во время когда игрок упал использовав полёт, у него не отнялись хп?
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Fly

Ухищрениями наверное. Смотря, что ты там расписал, оттого и исходить)

Не понял я тебя в общем можеть дать код плагина , который делает так чтобы при падении с любой высоты не отнимались хп.
 

AlmazON

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

при падении с любой высоты не отнимались хп
Когда игрок взлетает (сработка твоего кода), то делаешь SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage); с вызовом:
PHP:
public Action:OnTakeDamage(client, &attacker, &inflictor, &Float:damage, &damagetype)
{
	SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage);
	if(damagetype & DMG_FALL) return Plugin_Handled;
	return Plugin_Continue;
}
Думаю, сработает и так.
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Fly

Подскажите как тут сделать проверку на команду? Ну т.е чтобы спеки не могли использовать данную функцию и еще чтобы при падении с высоты при использовании полёта не отнимались хп?
PHP:
public Action:OnPlayerRunCmd(iClient, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
    static iPrevButtons[MAXPLAYERS+1];
    
    if ((buttons & IN_USE) && !(iPrevButtons[iClient] & IN_USE))
    {
        if (OnButtonUsePress(iClient) != Plugin_Continue)
        {
            buttons &= ~IN_USE;
        }
    }
    else if (!(buttons & IN_USE) && (iPrevButtons[iClient] & IN_USE))
    {
        OnButtonUseReleased(iClient);
    }
    iPrevButtons[iClient] = buttons;
    return Plugin_Continue;
}

Action:OnButtonUsePress(iClient)
{
	if (g_bHasFL[iClient] && IsPlayerAlive(iClient))
	{
	    if (GetEntityMoveType(iClient) == MOVETYPE_FLY) SetEntityMoveType(iClient, MOVETYPE_WALK);
		else if (!(GetEntityFlags(iClient) & FL_ONGROUND)) SetEntityMoveType(iClient, MOVETYPE_FLY);
	}
	return Plugin_Continue;
}

OnButtonUseReleased(iClient)
{
	{
		SetEntityMoveType(iClient, MOVETYPE_WALK);
	}
}
 

BenjaminPaul

Code is poetry
Сообщения
177
Реакции
220
Re: [Shop] Fly

Подскажите как тут сделать проверку на команду? Ну т.е чтобы спеки не могли использовать данную функцию?

Я в шоке от этого момента:
PHP:
if (OnButtonUsePress(iClient) != Plugin_Continue)

и этого внутри OnPlayerRunCmd
PHP:
static iPrevButtons[MAXPLAYERS+1];

Ну да ладно...

Проверку команд можешь сделать в этом блоке:
PHP:
Action:OnButtonUsePress(iClient)

Примерно так:
PHP:
if (g_bHasFL[iClient] && IsPlayerAlive(iClient) && GetClientTeam(iClient) > 1)

Не знаю, будет ли оно несколько раз проверятся, ибо OnPlayerRunCmd опасная вещь.
думаю это предотвращает iPrevButtons[iClient], так что все нормально.

и еще чтобы при падении с высоты при использовании полёта не отнимались хп
Сударь, используйте SDKHooks.

PHP:
public Action:OnTakeDamage(client, &attacker, &inflictor, &Float:damage, &damagetype)

AlmazON, не правильно написал, ты блокируешь весь урон от падения.
А он сказал - "при падении с высоты при использовании полёта"

PHP:
public OnClientPutInServer(client)
{
	SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public OnClientDisconnect(client)
{
	SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action:OnTakeDamage(client, &attacker, &inflictor, &Float:damage, &damagetype)
{
	/* Делаешь проверку валидности клиента и прочее */
}

Слушай, а не проще просто сделать так, чтобы урон на падение не шёл на команду Террористов?
У тебя же я так понимаю Props сервер.

Если не Props, то тогда, нужно делать задержку после отпускания кнопки E, и делать "смертным" человека.
Добавляем bool для всех игроков, при отпускании кнопки запускается таймер, можно сделать на несколько секунд, или до приземления, и тогда делать "смертным".
Всё это очень плохо.

...
 
Последнее редактирование:

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Fly

Я в шоке от этого момента:
PHP:
if (OnButtonUsePress(iClient) != Plugin_Continue)

Ну да ладно...

Проверку команд можешь сделать в этом блоке:
PHP:
Action:OnButtonUsePress(iClient)

Примерно так:
PHP:
if (g_bHasFL[iClient] && IsPlayerAlive(iClient) && GetClientTeam(iClient) > 1)

Не знаю, будет ли оно несколько раз проверятся, ибо OnPlayerRunCmd опасная вещь.
думаю это предотвращает iPrevButtons[iClient], так что все нормально.


Сударь, используйте SDKHooks.

PHP:
public Action:OnTakeDamage(client, &attacker, &inflictor, &Float:damage, &damagetype)

Удачи! :victory:
Можно примерно готовый код?
 

BenjaminPaul

Code is poetry
Сообщения
177
Реакции
220
Re: [Shop] Fly

Можно примерно готовый код?

Ты не ответил на мои вопросы, которые я подредактировал.

Я тебе написал всю логику работы того, что тебе нужно.

Тебе осталось лишь это всё написать и всё! :)
 

AlmazON

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

не правильно написал, ты блокируешь весь урон от падения
Ты написал ещё хуже, сразу отлавливая событие урона. И всмотрись в мой код - там идёт отключение сразу после первого удара, коим и будет являться падение после отпускания кнопки. Другое дело, как это адекватно будет работать.
при отпускании кнопки запускается таймер
таймером тоже не очень
Всё это было сказано, не надо ля-ля.
 

BenjaminPaul

Code is poetry
Сообщения
177
Реакции
220
Re: [Shop] Fly

neatek3, ты всё еще жив? :-D
Оффтоп

PHP:
public Action:OnTakeDamage(client, &attacker, &inflictor, &Float:damage, &damagetype) 
{ 
    SDKUnhook(client, SDKHook_OnTakeDamage, OnTakeDamage); 
    if(damagetype & DMG_FALL) return Plugin_Handled; 
    return Plugin_Continue; 
}

Я бы сделал как я написал, потому что обычно в этой функции у меня еще другие обработки, не только падение.
В любом случае можно попробовать.
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Помогите ребят. Делаю модуль для шопа от фроза . Есть проблемы , не могу зарегистрировать модуль в категории Дополнительно, и кучка ошибочек. И нужно прикрутить таймер , чтобы когда в чат писали !st сообщение выводилось после введёной команды а не наоборот.
Суть плагина в том что игрок пишет в чат !st и его команда меняется на противоположную .
Вот код :
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <sdktools_functions>
#include <shop>

new bool:g_bHasSP[MAXPLAYERS+1];
new Handle:g_hPrice,
	Handle:g_hSellPrice,
	Handle:g_hDuration,
	ItemId:id;

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

public OnPluginStart()
{
	RegConsoleCmd("sm_st", Command_St); 

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

	AutoExecConfig(true, "shop_swapteam", "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("Stuff", "");
	
	if (Shop_StartItem(category_id, "swapteam"))
	{
		Shop_SetInfo("Свободная смена команды [!st]", "", 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 Shop_OnClientAuthorized(iClient) g_bHasSP[iClient] = (Shop_IsClientHasItem(iClient, id) && Shop_IsClientItemToggled(iClient, id)) ? true:false;

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

	g_bHasSP[iClient] = true;

	return Shop_UseOn;
}

public Action:Command_St(iClient, args) 
{
    if (g_bHasSP[iClient] && iClient && IsClientInGame(iClient) || IsPlayerAlive(iClient) && ForcePlayerSuicide(iClient))  
        { 
            new playerTeam = GetClientTeam(iClient); 
            if(playerTeam == CS_TEAM_T)			
            { 
                CS_SwitchTeam(iClient, CS_TEAM_CT); 
                PrintToChat(iClient,"\x04[Swap Team] \x01Вы сменили команду! \x03[T > CT]"); 
            } 
            else if(playerTeam == CS_TEAM_CT)			
            { 
                CS_SwitchTeam(iClient, CS_TEAM_T); 
                PrintToChat(iClient,"\x04[Swap Team] \x01Вы сменили команду! \x03[CT > T]"); 
            } 
        } 
		else 
				PrintToChat(iClient,"\x04[Swap Team] \x01Вы не купили данную возможность в \x03!shop \x01:)");  
}
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Swap Team

А остальные ошибки поможешь исправить?
 

smoke96

Участник
Сообщения
1,134
Реакции
175
Re: [Shop] Swap Team

B1g, я с VIP и SHOP не дружу, не знаю никаких нативов там и правил составления модулей.Это неверно. Не хватает скобок или, вернее, стоит изменить условие:
PHP:
public OnClientSayCommand_Post(iClient, const String:command[], const String:sArgs[])
{
	if (strcmp(sArgs, "st", false) == 0 && iClient)
	{
		if (g_bHasSP[iClient])
		{
			if (IsClientInGame(iClient))
			{
				if (IsPlayerAlive(iClient)) ForcePlayerSuicide(iClient);
				switch (GetClientTeam(iClient))
				{
					case CS_TEAM_T:
					{
						CS_SwitchTeam(iClient, CS_TEAM_CT);
						PrintToChat(iClient,"\x01\04[Swap Team] \x01Вы сменили команду! \x03[T > CT]");
					}
					case CS_TEAM_CT:
					{
						CS_SwitchTeam(iClient, CS_TEAM_T);
						PrintToChat(iClient,"\x01\04[Swap Team] \x01Вы сменили команду! \x03[CT > T]");
					}
				}
			}
		}
		else PrintToChat(iClient,"\x01\04[Swap Team] \x01Вы не купили данную возможность в \x03!shop \x01:)");
	}
}
Все равно сообщения появляются перед написанной командой.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Re: [Shop] Swap Team

PHP:
if (g_bHasSP[iClient] && iClient && IsClientInGame(iClient) || IsPlayerAlive(iClient) && ForcePlayerSuicide(iClient))
- это как?
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Re: [Shop] Swap Team

А чем уже RegConsoleCmd(client, args); не вариант?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #20
Re: [Shop] Swap Team

Primo, есть свои нюансы.
 
Сверху Снизу