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

Отражение пуль  [Решено]

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

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

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

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

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

Отражение пуль

Сообщение simplyDavchik » 10 май 2018, 20:41

Есть я думаю всем известный плагин для управления выстрелами, как сделать вот этот код но для Ham_TraceAttack

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>

#define PLUGIN "Shot Menu"
#define VERSION "1.2"
#define AUTHOR "vnycha"

/*

Version 1.0
 - Initial release.
 
Version 1.1
 - Small optimization with the menu.
 
 */

new settings[33] = { 0, ... }
new 
menu

new traceline_forward = -1tracehull_forward = -1

new mode[] = { 0// None
                 
1// Makes headshots (shooter)
            
2// Reflects bullets back to shooter
                 
3// Gets headshot (victim)
                 
4// Bad aimer (shots randomly directed to left or right leg)
                 
5// Deals no damage (shots directed to HIT_SHIELD)
                 
6// Suicider
                 
7  // Uber suicider
              
}

#pragma unused mode // Gets rid of "symbol mode not used" warning.

new label[][] = { "None"// Yellow text if it's good, red if bad
          
"\yShooter",
          
"\yBullect reflector",
          
"\rVictim",
          
"\rBad Aim",
          
"\rNo Damage",
          
"\rSuicider",
          
"\rUber Suicider"
        
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
        
    
register_clcmd("amx_shot_menu""conjure_menu"ADMIN_SLAY"Displays shot administration menu.")
}

public 
client_disconnect(id)
{
    
settings[id] = 0
}

public 
set_forwards_registered(bool:condition)
{
    if (
condition && traceline_forward == -&& tracehull_forward == -1)
    {
        
traceline_forward register_forward(FM_TraceLine"fw_traceline")
        
tracehull_forward register_forward(FM_TraceHull"fw_tracehull"1)
    }
    
    if (!
condition && traceline_forward != -&& tracehull_forward != -1)
    {
        
unregister_forward(FM_TraceLinetraceline_forward)
        
unregister_forward(FM_TraceHulltracehull_forward1)
        
        
traceline_forward = -1
        tracehull_forward 
= -1    
    
}
    return 
PLUGIN_HANDLED
}

public 
conjure_menu(idlevelcid)
{
    if (
cmd_access(idlevelcid1))
    {
        
build_menu(id)
    }
    return 
PLUGIN_HANDLED
}

// For some reason, they don't allow default argument items in public functions.
stock build_menu(idpage 0)
{
    
menu menu_create("Shot Administration Menu""menu_handler")
    
    static 
players[32], numname[32], cmd[5], itemtxt[60]
    
    
get_players(playersnum)
    for (new 
inumi++)
    {
        
get_user_name(players[i], name31)
        
        
formatex(cmd4"%i"players[i])
        
formatex(itemtxt59"%s: %s"namelabel[settings[players[i]]])
        
        
menu_additem(menuitemtxtcmd)
    }
    
    
menu_display(idmenupage)
    return 
PLUGIN_CONTINUE
}

public 
menu_handler(idmenuitem)
{
    if (
item 0)
    {
        for (new 
i33i++)
        {
            if (
settings[i] != 0)
            {
                
set_forwards_registered(true)
                return 
PLUGIN_HANDLED
            
}
        }
        
        
set_forwards_registered(false)
        return 
PLUGIN_HANDLED
    
}
    
    static 
cmd[5], callbackaccesspid
    menu_item_getinfo
(menuitemaccesscmd4__callback)
    
    
pid str_to_num(cmd)
    
    if (
is_user_connected(pid))
    {
        
settings[pid] = ++settings[pid] % (sizeof mode)
    }
    
    
menu_destroy(menu)
        
    
build_menu(iditem 7)
    return 
PLUGIN_HANDLED
}

public 
fw_traceline(Float:start[3], Float:end[3], conditionsidptr)
{
    return 
process_trace(idptr)
}

public 
fw_tracehull(Float:start[3], Float:end[3], conditionshullidptr)
{
    return 
process_trace(idptr)
}

public 
process_trace(idptr)
{
    if (!
is_user_alive(id)) return FMRES_IGNORED
    
new target get_tr2(ptrTR_pHit)
    
    switch (
settings[id])
    {
        
// Shooter (headshots galore) mode. See how many kills you can get before people notice...
        
case 1:
        {
            if (!
is_user_alive(target)) return FMRES_IGNORED
            
            
new Float:origin[3], Float:angles[3]
            
engfunc(EngFunc_GetBonePositiontarget8originangles)
            
set_tr2(ptrTR_vecEndPosorigin)
            
// Why get bone origin? Well, CS will draw the blood spray from the headshot where ever your bullet was supposed to
            // land, as defined by the end[3] coordinates passed to the forward. So that meant shooting a person in the foot with the
            // shot being redirected to the head would produce a blood spray coming out of the foot. This made it a little harder
            // to hide the fact that you were 'cheating.' So, we just reset end[3] to the coordinates of the head bone of whomever
            // we're shooting, and we're in business!
            
set_tr2(ptrTR_iHitgroupHIT_HEAD)
        }
        
        
// Bad aiming. It doesn't help much. Usually it only takes 1 more hit than normal to kill. But they can't headshot, no matter
        // how hard they try.
        
case 4:
        {
            if (!
is_user_alive(target)) return FMRES_IGNORED
            set_tr2
(ptrTR_iHitgrouprandom_num(HIT_LEFTLEGHIT_RIGHTLEG))
            return 
FMRES_IGNORED
        
}
        
        
// Redirects hitgroup to HIT_SHIELD. This might be annoying to the person who gets shot, but it won't hurt them. Might throw
        // off their aim. I was going to use set_tr2(ptr, TR_flFraction, 100.0) but it does something weird with shotguns. Instead of
        // dealing no damage, shotguns actually give the target a gigantic boost in health! I couldn't figure it out, so I just left
        // it as this.
        
case 5:
        {
            if (!
is_user_alive(target)) return FMRES_IGNORED
            set_tr2
(ptrTR_iHitgroup8)
        }
        
        
// A hit on the enemy is redirected onto the shooter. Pretty simple.
        
case 6:
        {
            if (
is_user_alive(target) && cs_get_user_team(target) != cs_get_user_team(id))
            {
                
set_tr2(ptrTR_pHitid)
            }
        }
        
        
// A hit anywhere (teammate, wall, or enemy) is redirected onto the shooter's head.
        
case 7:
        {
            
set_tr2(ptrTR_pHitid)
            
set_tr2(ptrTR_iHitgroupHIT_HEAD)
            return 
FMRES_IGNORED
        
}
    }
    
    
// Person gets shot anywhere, it's turned into a headshot.
    
if (is_user_alive(target) && settings[target] == 3)
    {
        
set_tr2(ptrTR_iHitgroupHIT_HEAD)
    }
    
    
// Shot is reflected to shooter. Giving this to someone makes them immune to guns.
    
if (is_user_alive(target) && settings[target] == 2)
    {
        
set_tr2(ptrTR_pHitid)
    }
    
    return 
FMRES_IGNORED
}
 


Вот что я делал для своего плагина, но не работает.
Код: Выделить всё
public Ham_TraceAttack_Pre(const iVictim, const iAttacker, const Float: fDamage, const Float: fDirection[3], TraceHandle, const iDamageType)
{
    if(!is_user_alive(iAttacker) || !is_user_alive(iVictim))
    {
        return HAM_IGNORED;
    }
    
    if
(GodsNeo[iVictim])
    {
        set_tr2(TraceHandle, TR_pHit, iAttacker);
    }

    return HAM_IGNORED;
Последний раз редактировалось simplyDavchik 10 май 2018, 21:30, всего редактировалось 1 раз.
Даже если цель не достижима, попробовать стоит.
Аватара пользователя
simplyDavchik
 
Сообщения: 132
Зарегистрирован: 08 апр 2017, 23:28
Откуда: Латвия
Благодарил (а): 15 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Java
C++
C#
Pawn

Re: Отражение пуль  [Решено]

Сообщение Doc Batcon » 10 май 2018, 21:28

Попробуйте этот способ
Код: Выделить всё
set_tr2(TraceHandle, TR_pHit, iAttacker); 

=>
Код: Выделить всё
SetHamParamInteger(1, iAttacker); 
Аватара пользователя
Doc Batcon
 
Сообщения: 35
Зарегистрирован: 18 сен 2016, 12:36
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn

Re: Отражение пуль

Сообщение simplyDavchik » 10 май 2018, 22:37

Doc Batcon писал(а):Попробуйте этот способ
Код: Выделить всё
set_tr2(TraceHandle, TR_pHit, iAttacker);

=>
Код: Выделить всё
SetHamParamInteger(1, iAttacker);

Работает, спасибо
Даже если цель не достижима, попробовать стоит.
Аватара пользователя
simplyDavchik
 
Сообщения: 132
Зарегистрирован: 08 апр 2017, 23:28
Откуда: Латвия
Благодарил (а): 15 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Java
C++
C#
Pawn


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

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

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