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

Скриптинг с C4 бомбой

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

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

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

Скриптинг с C4 бомбой

Сообщение DJ_WEST » 08 сен 2009, 10:15

Автор: VEN

Перед тем, как начать, вы должны быть знакомы с основами AMXX скриптинга. Здесь используется функции из "Вы должны зарегистрироваться, чтобы видеть ссылки.". Чтобы получить индекс игрока (только внутри ""logevent_function_p"), необходимо использовать:
Код: Выделить всё

stock get_loguser_index
()
{
    new loguser[80], name[32]
    read_logargv(0, loguser, 79)
    parse_loguser(loguser, name, 31)
 
    return get_user_index
(name)
}
 
 

К примеру:
Код: Выделить всё

public logevent_function_p
() 
{
    new id = get_loguser_index()
    // Код
}  


1. Игрок/бомба
Бомба выкинута/у игрока:
Код: Выделить всё

    if 
(fm_find_ent_by_class(-1, "weapon_c4"))
 


Бомба выкинута:
Код: Выделить всё

    new bomb 
= fm_find_ent_by_class(-1, "weapon_c4")
    if (bomb && pev(bomb, pev_owner) > get_maxplayers()) 


Бомба у игрока/кто несет:
Код: Выделить всё
    new carrier = 0, ownerent, bomb = fm_find_ent_by_class(-1, "weapon_c4")
    if (bomb && (ownerent = pev(bomb, pev_owner)) <= get_maxplayers())
        carrier = ownerent
    if 
(carrier) // у нас есть владелец бомбы
    else // у нас нет владельца   


Указанный игрок имеет бомбу?
Код: Выделить всё
    if (user_has_weapon(id, CSW_C4)) // метод №1
    if (pev(id, pev_weapons) & (1<<CSW_C4)) // метода №2
    if (fm_find_ent_by_owner(-1, "weapon_c4", id)) // метод №3   


Передать бомбу от одного игрока другому:
Код: Выделить всё
    fm_transfer_user_gun(carrier, recipient, CSW_C4) // возвращает true при успешном выполнении   


Как заставить игрока выкинуть бомбу:
Код: Выделить всё
    engclient_cmd(id, "drop", "weapon_c4") 


Как удалить лежащую на земле бомбу:
Код: Выделить всё
    new weapbox, bomb = fm_find_ent_by_class(-1, "weapon_c4")
    if (bomb && (weapbox = pev(bomb, pev_owner)) > get_maxplayers()) 
    
{
        dllfunc(DLLFunc_Think, weapbox) // удаляет объекты weaponbox + weapon_c4
        // удаляет красную точку на радаре
        message_begin(MSG_ALL, get_user_msgid("BombPickup"))
        message_end()
    } 


Как дать бомбу игроку:
Код: Выделить всё
    fm_give_item(id, "weapon_c4")
    // используйте cs_set_user_plant(id), чтобы разрешить игроку минировать бомбу   


Как удалить бомбу у игрока:
Код: Выделить всё
    engclient_cmd(id, "weapon_c4")
    cs_set_user_bpammo(id, CSW_C4, 0)
    engclient_cmd(id, "lastinv")
    // удаляем HUD иконку бомбы
    message_begin(MSG_ONE, get_user_msgid("StatusIcon"), _, id)
    write_byte(0)
    write_string("c4")
    message_end() 


Бомба установлена/как удалить установленную бомбу:
Код: Выделить всё
    new bomb
    if 
((bomb = fm_find_ent_by_model(-1, "grenade", "models/w_c4.mdl"))) 
    
{
        // бомбу установлена
        fm_remove_entity(bomb) // удалить установленную бомбу
    }  


2. Выкинуть/взять
Событие, когда игрок появился с бомбой:
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Spawned_With_The_Bomb") 


Бомба выкинута (включает событие, когда игрок вышел с сервера или умер):
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Dropped_The_Bomb")
    // используйте is_user_alive/is_user_connected для проверки подключен/живой ли игрок   


Бомба поднята (кроме события появления игрока):
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Got_The_Bomb") 


Бомба получена (включает события появления игрока и give_item):
Код: Выделить всё
    register_event("WeapPickup", "event_function", "be", "1=6")  


3. Минирование/разминирование
Событие начала минирования бомбы:
Код: Выделить всё
    register_event("BarTime", "event_function", "be", "1=3") 


Бомба установлена:
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Planted_The_Bomb") 


Событие начала разминирования бомбы:
Код: Выделить всё
    register_event("BarTime", "event_function", "be", "1=5", "1=10") 


Событие начала разминирования бомбы (без щипцов):
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Begin_Bomb_Defuse_Without_Kit") 


Событие начала разминирования бомбы (с щипцами):
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Begin_Bomb_Defuse_With_Kit") 


Бомба разминирована:
Код: Выделить всё
    register_logevent("logevent_function_p", 3, "2=Defused_The_Bomb") 


Событие отмены минирования/разминирования бомбы (вы должны быть уверены, что минирование/разминирование бомбы в процессе) :
Код: Выделить всё
    register_event("BarTime", "event_function", "b", "1=0") 


Событие спасения цели:
Код: Выделить всё
    register_logevent("logevent_function", 6, "3=Target_Saved")  


4. Взрыв
Цель взорвана раньше окончания раунда:
Код: Выделить всё
    register_logevent("logevent_function", 6, "3=Target_Bombed") 


Событие взрыва бомбы (раньше/позже окончания раунда):
Код: Выделить всё
    register_event("23", "event_function", "a", "1=17", "6=-105", "7=17") 


Игрок убит от взрыва бомбы (не сработает, если игрок был убил от объекта env_explosion):
Код: Выделить всё
    public client_death(killer, victim, wpnindex, hitplace, TK) 
    
{
        if (wpnindex == CSW_C4)
    }  


5. Цель (место закладки бомбы)
Игрок находится на месте установки бомбы (func_bomb_target):
Код: Выделить всё
    // Примечание: нет хорошего способа определения находится ли игрок в info_bomb_target
    new target = -1, class[] = "func_bomb_target", bool:is_inside = false
    while 
((target = fm_find_ent_by_class(target, class)))
    {
        if (!fm_boxents_distance(index, target)) 
        
{
            is_inside = true
            break
        
}
    }
    if (is_inside) 


Карта содержит места закладки бомбы:
Код: Выделить всё
    if (fm_find_ent_by_class(-1, "func_bomb_target") || fm_find_ent_by_class(-1, "info_bomb_target")) 


Как удалить место закладки бомбы:
Код: Выделить всё
    new target = -1, classname[] = "func_bomb_target"
    while ((target = fm_find_ent_by_class(target, classname)))
        fm_remove_entity(target)
    classname = "info_bomb_target"
    while ((target = fm_find_ent_by_class(target, classname)))
        fm_remove_entity(target)  
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Скриптинг с C4 бомбой

Сообщение makito123 » 31 май 2011, 23:17

А как узнать где игрок начал минировать бомбу ?
Аватара пользователя
makito123
 
Сообщения: 206
Зарегистрирован: 19 фев 2011, 23:51
Благодарил (а): 39 раз.
Поблагодарили: 29 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Скриптинг с C4 бомбой

Сообщение fl0wer » 01 июн 2011, 02:23

csx.inc[pawn]forward bomb_planting(planter);
forward bomb_planted(planter);
forward bomb_explode(planter,defuser);
forward bomb_defusing(defuser);
forward bomb_defused(defuser); [/pawn]

Смотри мой плагин: Show Bomb.
Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Скриптинг с C4 бомбой

Сообщение makito123 » 01 июн 2011, 11:52

Залей сюда пожалуйста, а то там регистрация нужна)
Аватара пользователя
makito123
 
Сообщения: 206
Зарегистрирован: 19 фев 2011, 23:51
Благодарил (а): 39 раз.
Поблагодарили: 29 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Скриптинг с C4 бомбой

Сообщение bl0w » 30 янв 2012, 19:12

Когда лучше всего удалять место закладки бомбы?

[pawn]
  1. new target = -1, classname[] = "func_bomb_target"

  2.     while ((target = fm_find_ent_by_class(target, classname)))

  3.         fm_remove_entity(target)

  4.     classname = "info_bomb_target"

  5.     while ((target = fm_find_ent_by_class(target, classname)))

  6.         fm_remove_entity(target)
[/pawn]
Арендую сервера у ИгроХост`а

Бесплатно:
- Выделенный IP (port 27015)
- HLTV (+слот для него)
- TS сервер
- Веб-Хостинг, Домен .ru/.net/.рф
- Доступ к FTP, firewall
- И т.д...
- Подробнее тут -> http://p.game-servers.ru/20801/gs
Аватара пользователя
bl0w
 
Сообщения: 320
Зарегистрирован: 08 мар 2011, 12:41
Благодарил (а): 52 раз.
Поблагодарили: 32 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Скриптинг с C4 бомбой

Сообщение Bos93 » 30 янв 2012, 21:53

[pawn]
  1. #include < amxmodx >

  2. #include < engine >

  3.  

  4. public plugin_init( )   RemoveEntity( "func_bomb_target" )

  5.  

  6. RemoveEntity( const szClassName[ ] )

  7. {

  8.     new szFakeClassName[ 32 ];

  9.     GetFakeClassName( szClassName, szFakeClassName, charsmax( szFakeClassName ) )

  10.    

  11.     new iEntity = -1;

  12.     while( ( iEntity = find_ent_by_class( iEntity, szClassName ) ) )

  13.         entity_set_string( iEntity, EV_SZ_classname, szFakeClassName )

  14. }

  15.  

  16. GetFakeClassName( const szClassName[ ], szFakeClassName[ ], const iLen )

  17.     formatex( szFakeClassName, iLen, "___%s", szClassName )
[/pawn]
Всем добра, любви и осознанности.

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1425
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 514 раз.

Re: Скриптинг с C4 бомбой

Сообщение fl0wer » 30 янв 2012, 22:06

[pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3.  

  4. new g_FwdSpawn;

  5.  

  6. public plugin_precache()

  7.         g_FwdSpawn = register_forward(FM_Spawn, "FwdSpawn")

  8.  

  9. public plugin_init()

  10.         unregister_forward(FM_Spawn, g_FwdSpawn)

  11.  

  12. public FwdSpawn(pEntity)

  13. {

  14.         if(!pev_valid(pEntity))

  15.                 return FMRES_IGNORED;

  16.  

  17.         new szClassName[32];

  18.         pev(pEntity, pev_classname, szClassName, charsmax(szClassName))

  19.  

  20.         if(equal(szClassName, "func_bomb_target"))

  21.         {

  22.                 engfunc(EngFunc_RemoveEntity, pEntity)

  23.                 return FMRES_SUPERCEDE;

  24.         }

  25.        

  26.         return FMRES_IGNORED;

  27. }
[/pawn]
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Скриптинг с C4 бомбой

Сообщение noo00oob » 31 янв 2012, 10:14

Bos93
Даже если не обращать внимание на кучу лишних функций, сам метод неверен. Место закладки удалится, но при этом сама бомба будет выдаваться. Вот у fl0wer'a все верно.
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 394 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Скриптинг с C4 бомбой

Сообщение fl0wer » 31 янв 2012, 22:36

noo00oob, :boast:
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Скриптинг с C4 бомбой

Сообщение FROZCS » 22 июн 2013, 23:43

А как расширить зону установки бомбы на всю карту?
Вернулся с армейки)
Аватара пользователя
FROZCS
 
Сообщения: 62
Зарегистрирован: 28 авг 2011, 20:03
Благодарил (а): 5 раз.
Поблагодарили: 2 раз.

След.

Вернуться в Статьи / фрагменты кода

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3