Объясните использование команды return

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
Салют.
Собственно, вопрос в названии темы.
Решил немного изменить плагин фонарика, убрал ненужные квары, получилось так:
PHP:
#pragma semicolon 1
#include <sdktools>

new Handle:g_FlashlightEnable;

public OnPluginStart()
{
    // ConVar
    g_FlashlightEnable = CreateConVar("timer_flashlightenable", "1", "Adds a flashlight in the game", 0, true, 0.0, true, 1.0);
  
    AddCommandListener(Command_LAW, "+lookatweapon");
    RegConsoleCmd("sm_flashlight", Command_Flashlight);
}

public Action:Command_LAW(int client, const String:command[], int argc)
{
    if(GetConVarBool(g_FlashlightEnable))
    {
        if(IsClientInGame(client) && IsPlayerAlive(client))
        {
            ToggleFlashlight(client);
        }
        return Plugin_Handled;
    }
}

public Action:Command_Flashlight(int client, int args)
{
    if(GetConVarBool(g_FlashlightEnable))
    {
        if(IsClientInGame(client) && IsPlayerAlive(client))
        {
            ToggleFlashlight(client);
        }
        return Plugin_Handled;
    }
}

void ToggleFlashlight(int client)
{
    SetEntProp(client, Prop_Send, "m_fEffects", GetEntProp(client, Prop_Send, "m_fEffects") ^ 4);
}
Но при компиляции возникалии ошибки(warning):
PHP:
warning 209: function "Command_LAW" should return a value
warning 209: function "Command_Flashlight" should return a value
Из ошибки я понял, что функция требует вернуть значение.
Странный вопрос, но зачем вообще это нужно?:blink:
И каким именно параметром возвращать?
Plugin_Handled?
Plugin_Continue?
Исходя из переводов слов, я склоняюсь ко второму варианту, но хотелось бы именно понять, как это работает.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
public Action:Command_LAW(int client, const String:command[], int argc)
{
if(
GetConVarBool(g_FlashlightEnable))
{
if(
IsClientInGame(client) && IsPlayerAlive(client))
Если плагин через квар отключён, игрок не в игре, либо мёртв, то блокировать использование кнопки:
Блокировать.
Разрешить.
public Action:Command_Flashlight(int client, int args)
Для консольных команд, употреблённых правильно (вместо отлова чата через AddCommandListener, например - неправильно) всегда return Plugin_Handled;
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Павн, как си-подобный язык, много унаследовал от си. К примеру то, что в языке нет процедур, есть только функции. Функция должна возвращать значение согласно своему типу. Если функция имеет тип void, то она не возвращает значение. В данном случае возвращаемое функцией значение определяет действие, которое последует в зависимости от этого самого значения. Предупреждения возникли из-за того, что функция не во всех ситуациях может вернуть значение, а только если значение квара пложительное. Следует дописать в конец коллбека Command_LAW "return Plugin_Continue" и в коллбек Command_Flashlight "return Plugin_Handler" перед закрывающейся скобкой.
 

hitmany

Участник
Сообщения
171
Реакции
97
но хотелось бы именно понять, как это работает.

Оператор return имеет два назначения. Во-первых, немедленный выход из функции. То есть он осуществляет выход в вызывавший функцию код. Во-вторых, может использоваться для возврата значения.
Некоторые функции требует возврата значения, такие например как Command_LAW и Command_Flashlight в вашем случае

Описание операторов return Plugin_

Оффтоп
 

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
Всем спасибо за помощь!
 
Последнее редактирование:
Сверху Снизу