Несколько вопросов по sourcepawn

pashek71

Участник
Сообщения
232
Реакции
43
Как можно проверить двигается ли игрок?(К примеру снимать ему хп каждые 0.25 секунды, если он не двигается)
Как воспроизвести музыку всем игрокам, при этом чтобы она не сбивалась музыкой из других плагинов/карт.
Как определить длительность музыки? К примеру воспроизвести ее и по окончанию выдать всем по +5хп.
 
Последнее редактирование:

FurFur

Участник
Сообщения
153
Реакции
85
Как можно проверить двигается ли игрок?(К примеру снимать ему хп каждые 0.25 секунды, если он не двигается)

Как то так
PHP:
#include <sourcemod>

float fLastPos[MAXPLAYERS + 1][3];

Handle hTimer[MAXPLAYERS + 1];

public void OnPluginStart()
{
    HookEvent("player_spawn", OnPlayerRespawn);
}

public void OnPlayerRespawn(Event rEvent, const char[] rName, bool rBroadcast)
{
    int iResp = GetClientOfUserId(rEvent.GetInt("userid"));
    if (IsClientInGame(iResp) && GetClientTeam(iResp) > 1 && IsPlayerAlive(iResp))
    {
        GetClientAbsOrigin(iResp, fLastPos[iResp]);
        if (hTimer[iResp] == null) CreateTimer(0.25, CheckClientPos, iResp, TIMER_REPEAT);
    }
}

public Action CheckClientPos(Handle h_Timer, any i_Client)
{
    if (IsClientInGame(i_Client) && IsPlayerAlive(i_Client))
    {
        float fSecondPos[3];
        GetClientAbsOrigin(i_Client, fSecondPos);
        if (fLastPos[i_Client][0] == fSecondPos[0] && fLastPos[i_Client][1] == fSecondPos[1] && fLastPos[i_Client][2] == fSecondPos[2])
        {
            //Игрок не сдвинулся
        }
        
        GetClientAbsOrigin(i_Client, fLastPos[i_Client]);
        return Plugin_Continue;
    }

    hTimer[i_Client] = null;
    return Plugin_Stop;
}

/**END**/
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #3
Как воспроизвести музыку всем игрокам, при этом чтобы она не сбивалась музыкой из других плагинов/карт.
Никак.

Как определить длительность музыки? К примеру воспроизвести ее и по окончанию выдать всем по +5хп.
Никак. Тут можно прибегнуть к "костылям" и написать расширение для SourceMod'а, которое будет содержать функцию, которая по имени аудиофайла будет возвращать его длительность, но не думаю, что ты знаешь C++.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@CrazyHackGUT, а почему нельзя распарсить mp3 файл посредством павна?
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
@pashek71, @CrazyHackGUT, можно отправить звук в канал SNDCHAN_STATIC. Правда, я использовал его для проигрывания сразу многих звуков от одного плагина и в ксго. Но работало как надо, я мог проиграть сразу несколько звуков одновременно, и ни один из них не останавливал другой.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Как.
Как написал выше @Reiko1231 , универсальный способ - ставить канал SNDCHAN_STATIC, на котором звуки не сбиваются друг другом.
Как определить длительность музыки? К примеру воспроизвести ее и по окончанию выдать всем по +5хп.
Использовать библиотеку [EXTENSION] Sound Info Library v1.0.1 - AlliedModders
 

Колян

Участник
Сообщения
180
Реакции
5
Дабы не плодить темы буду писать свои вопросы тут, сегодня тоже появилось желание заняться переписью синтаксиса (код станет более похожим на c++ что очень даже круто).

Очень прошу не кидать в меня камни, т.к многие участки кодов писал на скорую руку.
Я буду писать примеры на старом синтаксисе (на тарой СМ компилило нормально) а вы будете переводить так как оно должно быть, я бы мог этим заняться сам, но чет я себе не доверяю в новом деле (боюсь вызвать ошибки на этапе выполнения).
if (!StrEqual(value, "", false)) - error 178: cannot coerce int[] to char[]; storage classes differ
_______________________
value = ""; - error 179: cannot assign int[] to char[], storage classes differ
_______________
--- Добавлено позже ---
valve[0] = 0;
valve = "\0";

как будет правильнее обнулить строку?
--- Добавлено позже ---
if (!StrEqual(value, "", false))
=
if (valve != "\0") или if (valve[0] != 0)
и тут как лучше?
--- Добавлено позже ---
valve= valve_x; - ругается на такую передачу строки - error 179: cannot assign int[] to char[], storage classes differ

if (!StrEqual("", valve_xss[j], false)) - почему НЕ ругается на это хотя ругается на это - if (!StrEqual(value, "", false)) ????

--- Добавлено позже ---
ЕПРСТ мне старая вресия СМ (3 летней давности) не говрила что я напутал с типами... походу все будет от туда... не внимательность...
--- Добавлено позже ---
___________________________
new String:dataend[55], datastart[55];
FormatTime(dataend, 55, "%d/%m/%Y - %H:%M", End[client]);
FormatTime(dataplus, 55, "%d/%m/%Y - %H:%M", Start[client]); -error 178: cannot coerce int[] to char[]; storage classes differ
___________

new String:dataend[55], datastart[55]; - подобное перечисление типов считается не верным, как создать несколько переменных чтоб по 10 раз не писать String ?
--- Добавлено позже ---
new String:dataend[55], String:datastart[55]; - это самый короткий способ?(
 
Последнее редактирование:

AlmazON

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

Колян

Участник
Сообщения
180
Реакции
5
void CreateBlockEntity(const Float:pos[3], const Float:ang[3], const String:g_szModel[])
{
... ля ля ля...
- : warning 209: function "CreateBlockEntity" should return a value
}

почему ругается? ведь функция и не должна ниче возвращать...
 

AlmazON

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

Колян

Участник
Сообщения
180
Реакции
5
PHP:
// Line 1: #pragma semicolon 1
// Line 2: #pragma newdecls required
SourcePawn Transitional Syntax - AlliedModders Wiki
PHP:
/**
 * vim: set ts=4 :
 * =============================================================================
 * EmitSoundAny
 * Play sounds in a cross-game friendly way CS:GO and DOTA2 friendly way.
 *
 * EmitSoundAny (C)2014 AlliedModders and Powerlord (Ross Bemrose)
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
 * =============================================================================
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, version 3.0, as published by the
 * Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * As a special exception, AlliedModders LLC gives you permission to link the
 * code of this program (as well as its derivative works) to "Half-Life 2," the
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
 * by the Valve Corporation.  You must obey the GNU General Public License in
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
 * this exception to all derivative works.  AlliedModders LLC defines further
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
 * or <http://www.sourcemod.net/license.php>.
 *
 * Version: 1.0.3
 */
#if defined _emitsoundany_included
 #endinput
#endif
#define _emitsoundany_included

#include <sdktools>

static bool:g_bCheckedEngine = false;
static bool:g_bNeedsFakePrecache = false;

stock static EmitSoundCheckEngineVersion()
{
    if (g_bCheckedEngine)
    {
        return;
    }

    new EngineVersion:engVersion = GetEngineVersion();
   
    if (engVersion == Engine_CSGO || engVersion == Engine_DOTA)
    {
        g_bNeedsFakePrecache = true;
    }
    g_bCheckedEngine = true;
}

stock static bool:FakePrecacheSoundEx( const String:szPath[] )
{
    decl String:szPathStar[PLATFORM_MAX_PATH];
    Format(szPathStar, sizeof(szPathStar), "*%s", szPath);
   
    AddToStringTable( FindStringTable( "soundprecache" ), szPathStar );
    return true;
}

stock bool:PrecacheSoundAny( const String:szPath[], bool:preload=false)
{
    EmitSoundCheckEngineVersion();
   
    if (g_bNeedsFakePrecache)
    {
        return FakePrecacheSoundEx(szPath);
    }
    else
    {
        return PrecacheSound(szPath, preload);
    }
}

stock EmitSoundAny(const clients[], 
                 numClients, 
                 const String:sample[], 
                 entity = SOUND_FROM_PLAYER, 
                 channel = SNDCHAN_AUTO, 
                 level = SNDLEVEL_NORMAL, 
                 flags = SND_NOFLAGS, 
                 Float:volume = SNDVOL_NORMAL, 
                 pitch = SNDPITCH_NORMAL, 
                 speakerentity = -1, 
                 const Float:origin[3] = NULL_VECTOR, 
                 const Float:dir[3] = NULL_VECTOR, 
                 bool:updatePos = true, 
                 Float:soundtime = 0.0)
{
    EmitSoundCheckEngineVersion();

    decl String:szSound[PLATFORM_MAX_PATH];
   
    if (g_bNeedsFakePrecache)
    {
        Format(szSound, sizeof(szSound), "*%s", sample);
    }
    else
    {
        strcopy(szSound, sizeof(szSound), sample);
    }
   
    EmitSound(clients, numClients, szSound, entity, channel, level, flags, volume, pitch, speakerentity, origin, dir, updatePos, soundtime);   
}

stock EmitSoundToClientAny(client,
                const String:sample[],
                entity = SOUND_FROM_PLAYER,
                channel = SNDCHAN_AUTO,
                level = SNDLEVEL_NORMAL,
                flags = SND_NOFLAGS,
                Float:volume = SNDVOL_NORMAL,
                pitch = SNDPITCH_NORMAL,
                speakerentity = -1,
                const Float:origin[3] = NULL_VECTOR,
                const Float:dir[3] = NULL_VECTOR,
                bool:updatePos = true,
                Float:soundtime = 0.0)
{
    new clients[1];
    clients[0] = client;
    /* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */
    entity = (entity == SOUND_FROM_PLAYER) ? client : entity;
    EmitSoundAny(clients, 1, sample, entity, channel, 
    level, flags, volume, pitch, speakerentity,
    origin, dir, updatePos, soundtime);
}

stock EmitSoundToAllAny(const String:sample[], 
                 entity = SOUND_FROM_PLAYER, 
                 channel = SNDCHAN_AUTO, 
                 level = SNDLEVEL_NORMAL, 
                 flags = SND_NOFLAGS, 
                 Float:volume = SNDVOL_NORMAL, 
                 pitch = SNDPITCH_NORMAL, 
                 speakerentity = -1, 
                 const Float:origin[3] = NULL_VECTOR, 
                 const Float:dir[3] = NULL_VECTOR, 
                 bool:updatePos = true, 
                 Float:soundtime = 0.0)
{
    new clients[MaxClients];
    new total = 0;
   
    for (new i=1; i<=MaxClients; i++)
    {
        if (IsClientInGame(i))
        {
            clients[total++] = i;
        }
    }
   
    if (!total)
    {
        return;
    }
   
    EmitSoundAny(clients, total, sample, entity, channel, 
    level, flags, volume, pitch, speakerentity,
    origin, dir, updatePos, soundtime);
}

stock EmitAmbientSoundAny(const String:sample[],
                        const Float:pos[3],
                        entity = SOUND_FROM_WORLD,
                        level = SNDLEVEL_NORMAL,
                        flags = SND_NOFLAGS,
                        Float:vol = SNDVOL_NORMAL,
                        pitch = SNDPITCH_NORMAL,
                        Float:delay = 0.0)
{
    EmitSoundCheckEngineVersion();
   
    decl String:szSound[PLATFORM_MAX_PATH];
   
    if (g_bNeedsFakePrecache)
    {
        Format(szSound, sizeof(szSound), "*%s", sample);
    }
    else
    {
        strcopy(szSound, sizeof(szSound), sample);
    }
   
    EmitAmbientSound(szSound, pos, entity, level, flags, vol, pitch, delay);
}

stock StopSoundAny(entity, channel, const String:name[])
{
    EmitSoundCheckEngineVersion();
   
    decl String:szSound[PLATFORM_MAX_PATH];
   
    if (g_bNeedsFakePrecache)
    {
        Format(szSound, sizeof(szSound), "*%s", name);
    }
    else
    {
        strcopy(szSound, sizeof(szSound), name);
    }
   
    StopSound(entity, channel, szSound);
}

error 147: new-style declarations are required вот так ругается почти на каждую строку!
 
Сверху Снизу