Русское сообщество по скриптингу

[Custom Flashlight] Фонарь только для Людей ( FIX )  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

[Custom Flashlight] Фонарь только для Людей ( FIX )  [Решено]

Сообщение MayroN » 23 ноя 2017, 17:08

Поставил я в начало функции ето
Код: Выделить всё
if(get_user_team(id) == 2)

Получилось так
Код: Выделить всё
public Impulse_100(id)
{
    if( g_bEnabled )
    {
        if(is_user_alive(id))
                if(get_user_team(id) == 2)
        {
            #if defined ZOMBIE_PLAGUE
            if(zp_core_is_zombie(id))
            {
                return PLUGIN_HANDLED_MAIN
            
}
            #endif
                
            if
( g_bFlashLight[id] )
            {
                FlashlightTurnOff(id)
            }
            else if( g_iFlashBattery[id] )
            {
                FlashlightTurnOn(id)
            }
        }    
        return PLUGIN_HANDLED_MAIN    
    
}
    return PLUGIN_CONTINUE
}


Всё-бы да хорошо,но есть одна неприятность.Когда фонарь включён у Человека и тебя в это время заражает зомби ( в итоге ты зомби ) и потом нету возможности вообще его отключить ,как бы не активная кнопка F.Если удасться исправить - буду презнателен.

Весь код:
Код: Выделить всё
/*    Copyright  2008, ConnorMcLeod

    Custom Flashligh is free software;
    you can redistribute it and/or modify it under the terms of the
    GNU General Public License 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 Custom Flashligh; if not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.
*/

/*
* v0.5.4 (10.20.09)
* attempt to fix the bug when you can re-activate fl when empty
*
* v0.5.3 (09/01/09)
* -fixed little errors due to version change
* -added player range check in death event
*
* v0.5.2 (07/23/09)
* -fixed inverted teams colors
*
* v0.5.1 (04/04/09)
* -haven't realised i can remove FM include
*
* v0.5.0 (04/03/09)
* - use register_think instead of FM_CmdStart
* - use client_PreThink instead of FM_PlayerPreThink
* - use get_user_origin mode 1 and 3 instead of fakemeta stock
* - replaced some FM natives+enums with amxx natives (emit_sound, write_coord)
*
* v0.4.0 (07/27/08)
* - replaced cvars with commands
* - .ini file now supports prefix/per map configs
*
* v0.3.1 (06/29/08)
* - fixed bug when you could have seen normal flashlight
*
* v0.3.0 (06/21/08)
*
* - some code optimizations (thanks to simon logic and jim_yang)
* - changes cvars flashlight_drainfreq and flashlight_chargefreq to
*  flashlight_fulldrain_time and flashlight_fullcharge_time
*  (simon logic suggestion)
* - moved random colors into $CONFIGSDIR/flashlight_colors.ini
*
* v0.2.0
* First public release
*/

//#define ZOMBIE_PLAGUE

#include <amxmodx>
#include <amxmisc>
#include <engine>

#if defined ZOMBIE_PLAGUE
#include <zp50_core>
#endif

#define PLUGIN "Custom Flashlight"
#define AUTHOR "ConnorMcLeod"
#define VERSION "0.5.4"

/* **************************** CUSTOMIZATION AREA ******************************** */

new const SOUND_FLASHLIGHT_ON[] = "items/flashlight1.wav"
new const SOUND_FLASHLIGHT_OFF[] = "items/flashlight1.wav"

#define LIFE    1    // try 2 if light is flickering

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

#define MAX_PLAYERS    32

enum {
    Red,
    Green,
    Blue
}

new Array:g_aColors
new g_iColorsNum
new g_iMaxPlayers
new bool
:g_bFlashLight[MAX_PLAYERS+1]
new g_iFlashBattery[MAX_PLAYERS+1]
new Float:g_flFlashLightTime[MAX_PLAYERS+1]
new g_iColor[MAX_PLAYERS+1][3]
new g_iTeamColor[2][3]
new g_msgidFlashlight, g_msgidFlashBat
new g_bEnabled 
= true
new g_iShowAll 
= 1
new g_iColorType 
= 0
new g_iRadius 
= 9
new g_iMaxRadius 
= 16
new g_iAttenuation 
= 5
new g_iDistanceMax 
= 2000
new Float
:g_flDrain = 1.2
new Float
:g_flCharge = 0.2
new g_iSelfLum 
= 1
new g_iSelfRadius 
= 10
new g_iSelfOffset 
= 40
new g_iSelDecay 
= 10
new g_iSelColShift 
= 0
new Float
:g_flRate = 0.02
new Float
:g_flLastTime[MAX_PLAYERS+1]
new g_iLife = 1

public plugin_precache
()
{
    precache_sound(SOUND_FLASHLIGHT_ON)
    precache_sound(SOUND_FLASHLIGHT_OFF)
}

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )
    register_concmd("flashlight_set", "plugin_settings", ADMIN_CFG)
    register_impulse(100, "Impulse_100")
    register_event("HLTV", "Event_HLTV_newround", "a", "1=0", "2=0")
    register_event("DeathMsg", "Event_DeathMsg", "a")
    plugin_precfg()
}

plugin_precfg()
{
    g_iTeamColor[1] = {255,0,0}
    g_iTeamColor[0] = {0,0,255}

    g_msgidFlashlight = get_user_msgid("Flashlight")
    g_msgidFlashBat = get_user_msgid("FlashBat")

    g_iMaxPlayers = get_maxplayers()

    new szConfigFile[128], szCurMap[64], szConfigDir[128], i, szTemp[128]

    get_localinfo("amxx_configsdir", szConfigDir, charsmax(szConfigDir))
    formatex(szConfigFile, 127, "%s/flashlight_colors.ini", szConfigDir)
    get_mapname(szCurMap, 63)

    while(szCurMap[i] != '_' && szCurMap[i++] != '^0') {/*do nothing*/}
    
    if 
(szCurMap[i]=='_')
    {
        // this map has a prefix
        szCurMap[i]='^0';
        formatex(szTemp, 127, "%s/flashlight/prefix_%s.ini", szConfigDir, szCurMap)
        if(file_exists(szTemp))
        {
            copy(szConfigFile, 127, szTemp)
        }
    }

    get_mapname(szCurMap, 63)    
    formatex
(szTemp, 127, "%s/flashlight/%s.ini", szConfigDir, szCurMap)
    if (file_exists(szTemp))
    {
        copy(szConfigFile, 127, szTemp)
    }

    new iFile = fopen(szConfigFile, "rt")
    if(!iFile)
    {
        return
    
}

    g_aColors = ArrayCreate(3)

    new szColors[12], szRed[4], szGreen[4], szBlue[4], iColor[3]
    while(!feof(iFile))
    {
        fgets(iFile, szColors, 11)
        trim(szColors)
        if(!szColors[0] || szColors[0] == ';' || (szColors[0] == '/' && szColors[1] == '/'))
            continue
        parse
(szColors, szRed, 3, szGreen, 3, szBlue, 3)
        iColor[Red] = str_to_num(szRed)
        iColor[Green] = str_to_num(szGreen)
        iColor[Blue] = str_to_num(szBlue)
        ArrayPushArray(g_aColors, iColor)
    }
    fclose(iFile)

    g_iColorsNum = ArraySize(g_aColors)
}

public plugin_settings(id, level, cid)
{
    if( !cmd_access(id, level, cid, 3) )
    {
        return PLUGIN_HANDLED
    
}

    new szCommand[8], szValue[10]
    read_argv(1, szCommand, 7)
    read_argv(2, szValue, 9)
    switch( szCommand[0] )
    {
        case 'a': g_iAttenuation = str_to_num(szValue)
        case 'c':
        {
            switch( szCommand[5] )
            {
                case 'c': 
                
{                
                    new iColor
                    iColor 
= str_to_num(szValue)
                    g_iTeamColor[0][Red] = (iColor / 1000000)
                    iColor %= 1000000 
                    g_iTeamColor
[0][Green] = (iColor / 1000)
                    g_iTeamColor[0][Blue] = (iColor % 1000)
                }
                case 'e': g_flCharge = str_to_float(szValue) / 100
                case 
'm': g_bEnabled = str_to_num(szValue)
                case 't':
                {
                    if( szCommand[6] == 'e' )
                    {
                        new iColor
                        iColor 
= str_to_num(szValue)
                        g_iTeamColor[1][Red] = (iColor / 1000000)
                        iColor %= 1000000 
                        g_iTeamColor
[1][Green] = (iColor / 1000)
                        g_iTeamColor[1][Blue] = (iColor % 1000)
                    }
                    else
                    
{
                        g_iColorType = str_to_num(szValue)
                    }
                }
            }
        }
        case 'd':
        {
            if( szCommand[1] == 'i' )
            {
                g_iDistanceMax = str_to_num(szValue)
            }
            if( szCommand[1] == 'r' )
            {
                g_flDrain = str_to_float(szValue) / 100
            
}
        }
        case 'l': g_iLife = str_to_num(szValue)
        case 'r': g_iRadius = str_to_num(szValue)
        case 's': 
        
{
            switch( szCommand[3] )
            {
                case 'w': g_iShowAll = str_to_num(szValue)
                case 'e': g_iSelfLum = str_to_num(szValue)
                case 'r': g_iSelfRadius = str_to_num(szValue)
                case 'o': g_iSelfOffset = str_to_num(szValue)
                case 'd': g_iSelDecay = str_to_num(szValue)
                case 'c': g_iSelColShift = str_to_num(szValue)
            }
        }
        case 't': g_flRate = str_to_float(szValue)
        case 'm': g_iMaxRadius = str_to_num(szValue)
    }
    return PLUGIN_HANDLED
}

public client_putinserver(id)
{
    reset(id)
}

public Event_HLTV_newround()
{
    for(new id=1; id<=g_iMaxPlayers; id++)
    {
        reset(id)
    }
}

public Event_DeathMsg()
{
    reset(read_data(2))
}

reset(id)
{
    if( 1 <= id <= g_iMaxPlayers )
    {
        g_iFlashBattery[id] = 100
        g_bFlashLight
[id] = false
        g_flFlashLightTime
[id] = 0.0
    
}
}
  

public Impulse_100
(id)
{
    if( g_bEnabled )
    {
        if(is_user_alive(id))
        {
            #if defined ZOMBIE_PLAGUE
            if(zp_core_is_zombie(id))
            {
                return PLUGIN_HANDLED_MAIN
            
}
            #endif
                
            if
( g_bFlashLight[id] )
            {
                FlashlightTurnOff(id)
            }
            else if( g_iFlashBattery[id] )
            {
                FlashlightTurnOn(id)
            }
        }    
        return PLUGIN_HANDLED_MAIN    
    
}
    return PLUGIN_CONTINUE
}

public client_PreThink(id)
{
    static Float:flTime, Float:flCurrTime
    flTime 
= get_gametime()
    
    if
(g_flDrain && g_flFlashLightTime[id] && g_flFlashLightTime[id] <= flTime)
    {
        if(g_bFlashLight[id])
        {
            if(g_iFlashBattery[id])
            {
                g_flFlashLightTime[id] = g_flDrain + flTime
                g_iFlashBattery
[id]--
                
                if
(!g_iFlashBattery[id])
                {
                    FlashlightTurnOff(id)
                }
            }
        }
        else
        
{
            if(g_iFlashBattery[id] < 100)
            {
                g_flFlashLightTime[id] = g_flCharge + flTime
                g_iFlashBattery
[id]++
            }
            else
                g_flFlashLightTime
[id] = 0.0
        
}

        message_begin(MSG_ONE_UNRELIABLE, g_msgidFlashBat, _, id)
        write_byte(g_iFlashBattery[id])
        message_end()

    }
    if(g_bFlashLight[id])
    {
        flCurrTime = get_gametime()
        if((flCurrTime - g_flLastTime[id]) < g_flRate)
            return
                
        Make_FlashLight
(id)
        g_flLastTime[id] = get_gametime()        
    
}
}


Make_FlashLight(id)
{
    static iOrigin[3], iAim[3], iDist, iDecay, iAttn, iRad
    get_user_origin
(id, iOrigin, 1)
    get_user_origin(id, iAim, 3)
    
    iDist 
= get_distance(iOrigin, iAim)
    iDecay = iDist * 255 / g_iDistanceMax
    iAttn 
= 256 + iDecay * g_iAttenuation // barney/dontaskme
    iRad = g_iMaxRadius * iDist / g_iDistanceMax
                
    if
(g_iSelfLum)
    {        
        static Float
:fUserVec[3], Float:fOffs[3], iOffs[3]
        entity_get_vector(id, EV_VEC_angles, fUserVec)
        angle_vector(fUserVec, ANGLEVECTOR_FORWARD, fOffs )    

        iOffs
[0] = iOrigin[0] + floatround(fOffs[0]) * g_iSelfOffset
        iOffs
[1] = iOrigin[1] + floatround(fOffs[1]) * g_iSelfOffset
        iOffs
[2] = iOrigin[2] + floatround(fOffs[2]) * g_iSelfOffset        
        
        message_begin
(MSG_PVS, SVC_TEMPENTITY, iOffs)
        write_byte( TE_DLIGHT )
        write_coord( iOffs[0] )
        write_coord( iOffs[1] )
        write_coord( iOffs[2] )
        write_byte( g_iSelfRadius )
        write_byte( g_iColor[id][Red]>>g_iSelColShift  )
        write_byte( g_iColor[id][Green]>>g_iSelColShift)
        write_byte( g_iColor[id][Blue]>>g_iSelColShift )
        write_byte( g_iLife )
        write_byte( g_iSelDecay )
        message_end()
    }

    if( iDist > g_iDistanceMax )
        return

    if
( g_iShowAll )
    {
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    }
    else
    
{
        message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
    }
    write_byte( TE_DLIGHT )
    write_coord( iAim[0] )
    write_coord( iAim[1] )
    write_coord( iAim[2] )
    write_byte( iRad + g_iRadius )
    write_byte( (g_iColor[id][Red]<<8) / iAttn )
    write_byte( (g_iColor[id][Green]<<8) / iAttn )
    write_byte( (g_iColor[id][Blue]<<8) / iAttn )
    write_byte( g_iLife )
    write_byte( iDecay )
    message_end()
}

/*
Make_FlashLight(id)
{
    static iOrigin[3], iAim[3], iDist
    get_user_origin(id, iOrigin, 1)
    get_user_origin(id, iAim, 3)

    iDist = get_distance(iOrigin, iAim)

    if( iDist > g_iDistanceMax )
        return

    static iDecay, iAttn

    iDecay = iDist * 255 / g_iDistanceMax
    iAttn = 256 + iDecay * g_iAttenuation // barney/dontaskme

    if( g_iShowAll )
    {
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    }
    else
    {
        message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
    }
    write_byte( TE_DLIGHT )
    write_coord( iAim[0] )
    write_coord( iAim[1] )
    write_coord( iAim[2] )
    write_byte( g_iRadius )
    write_byte( (g_iColor[id][Red]<<8) / iAttn )
    write_byte( (g_iColor[id][Green]<<8) / iAttn )
    write_byte( (g_iColor[id][Blue]<<8) / iAttn )
    write_byte( LIFE )
    write_byte( iDecay )
    message_end()
}
*/

FlashlightTurnOff(id)
{
    emit_sound(id, CHAN_WEAPON, SOUND_FLASHLIGHT_OFF, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

    g_bFlashLight[id] = false

    FlashlightHudDraw
(id, 0)

    g_flFlashLightTime[id] = g_flCharge + get_gametime()
}

FlashlightTurnOn(id)
{
    
    emit_sound
(id, CHAN_WEAPON, SOUND_FLASHLIGHT_ON, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

    g_bFlashLight[id] = true

    FlashlightHudDraw
(id, 1)

    if( g_iColorType || !g_iColorsNum )
    {        
        g_iColor
[id] = g_iTeamColor[2-get_user_team(id)]
    }
    else
    
{
        ArrayGetArray(g_aColors, random(g_iColorsNum), g_iColor[id])
    }

    g_flFlashLightTime[id] = g_flDrain + get_gametime()
}

FlashlightHudDraw(id, iFlag)
{
    if( g_iShowAll )
    {
        emessage_begin(MSG_ONE_UNRELIABLE, g_msgidFlashlight, _, id)
        ewrite_byte(iFlag)
        ewrite_byte(g_iFlashBattery[id])
        emessage_end()
    }
    else
    
{
        message_begin(MSG_ONE_UNRELIABLE, g_msgidFlashlight, _, id)
        write_byte(iFlag)
        write_byte(g_iFlashBattery[id])
        message_end()
    }
}

#if defined ZOMBIE_PLAGUE
public zp_fw_core_infect_post(id, attacker)
{
    
    g_bFlashLight
[id] = false
    FlashlightHudDraw
(id, 0)
    g_flFlashLightTime[id] = g_flCharge + get_gametime()
}
#endif  
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 10