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

Делаем своё оружие.

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

Модератор: Chuvi

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

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

Делаем своё оружие.

Сообщение артист666 » 29 дек 2013, 05:16

В данной статье показан принцип добавления "своего" оружия.

Т.к. добавить новое оружие нельзя, будем "вешать" на уже существующее.

Для начала определимся, что за оружие у нас будет, и какое из существующих будет заменять.

Я выбрал гранатомёт. А заменять будем "xm1014", потому, что иконка немного похожа на модель.

Приблизительный план действий:
Меняем модель.
Блокируем нажатие кнопок.
Делаем свою атаку.
Отлавливаем касание объекта(гранаты), наносим урон.

Начнём.

[pawn]
  1. #include <amxmodx>

  2. #include <fakemeta_util>

  3. #include <hamsandwich>

  4.  

  5. // Регистрируем массивы для пути с названием моделей

  6. new v_m79 [] = "models/weapon/v_m79.mdl"

  7. new p_m79 [] = "models/weapon/p_m79.mdl"

  8.  

  9. public plugin_init()

  10. {

  11.         // Регистрируем событие выхватывания оружия - xm1014

  12.         RegisterHam(Ham_Item_Deploy, "weapon_xm1014", "deploy_xm1014", 1)

  13. }

  14. public plugin_precache()

  15. {

  16.         // Закачиваем модели игрокам

  17.         precache_model(v_m79)

  18.         precache_model(p_m79)

  19. }

  20. // В функцию передаётся только id оружия

  21. public deploy_xm1014(wpn)

  22. {

  23.         // Получаем владельца id игрока

  24.         static id; id = get_pdata_cbase(wpn, 41, 4)

  25.         // Заменяем V модель (от первого лица)

  26.         set_pev(id, pev_viewmodel2, v_m79)

  27.         // Заменяем P модель (ту что вядят другие игроки у вас в руках)

  28.         set_pev(id, pev_weaponmodel2, p_m79)

  29. }
[/pawn]
Первый пункт готов, но модель заменится у всех, кто держит в руках это оружие...

Для этого зарегистрируем булевую переменную, которой и будем отличать наше оружие от обычного.
А так как игроков много, сделаем лучше массив.
[pawn]
  1. new bool:weapon_m79[33]
[/pawn]
И поставим условие:
[pawn]
  1. // В функцию передаётся только id оружия

  2. public deploy_xm1014(wpn)

  3. {

  4.         // Получаем владельца, id игрока

  5.         static id; id = get_pdata_cbase(wpn, 41, 4)

  6.         // Если ячейка соответствующая id игрока имеет верное значение (true), то

  7.         if(weapon_m79[id])

  8.         {

  9.                 // Заменяем V модель (от первого лица)

  10.                 set_pev(id, pev_viewmodel2, v_m79)

  11.                 // Заменяем P модель (ту что вядят другие игроки у вас в руках)

  12.                 set_pev(id, pev_weaponmodel2, p_m79)

  13.         }

  14. }
[/pawn]
Так. Теперь сделаем выдачу, например вводом в чат "/m79".
Стоимость делать не будем, это легко можно сделать потом.

[pawn]
  1. public plugin_init()

  2. {

  3.         // Регистрируем консольную команду для выдачи

  4.         register_clcmd("say /m79", "cmd_m79")

  5. }

  6. // Выдаём оружие по команде

  7. public cmd_m79(id)

  8. {

  9.         // Защита от повторной выдачи

  10.         // Если ячейка имеет ложное значение (false)

  11.         if(!weapon_m79[id])

  12.         {

  13.                 // Меняем нашу переменную(ячейку массива) на true т.е. правда

  14.                 weapon_m79[id] = true

  15.                 // Выдаём игроку оружие

  16.                 fm_give_item(id, "weapon_xm1014")

  17.         }

  18.         // Если ячейка имеет верное значение говорим что у игрока уже есть это оружие

  19.         else client_print(id, print_center, "You have m79")

  20. }
[/pawn]
Английский знаю плохо, в школе учил немецкий (хотя немецкий я знаю ещё хуже)

Теперь давайте сделаем так, чтобы у игрока не было несколько основных оружий..
[pawn]
  1. // Зарегистрируем двумерный массив, и заполним его ячейки названиями основного оружия

  2. // В том порядке как оно идёт, а остальные и нулевую(id начинаются с 1) оставим пустыми ""

  3. new drop_weapon[][] =

  4. {

  5.         "","weapon_p228","weapon_shield","weapon_scout","","weapon_xm1014","","weapon_mac10","weapon_aug","","","",

  6.         "weapon_ump45","weapon_sg550","weapon_galil","weapon_famas","weapon_usp","","weapon_awp","weapon_mp5navy",

  7.         "weapon_m249","weapon_m3","weapon_m4a1","weapon_tmp","weapon_g3sg1","","","weapon_sg552","weapon_ak47","","weapon_p90"

  8. }
[/pawn]
А это поставим перед выдачей нашего оружия
[pawn]
  1. // Если у игрока уже есть основное оружие, то

  2. if(get_pdata_int(id, 116, 5))

  3. {

  4.         // Получаем все индексы оружия игрока и общее количество

  5.         new weapons[32], num; get_user_weapons(id, weapons, num)

  6.         // Делаем цикл

  7.         for(new i = 0; i < num; i++)

  8.         {

  9.                 // Если ячейка не пустая, то выдать в консоль игроку drop+содержимое ячейки

  10.                 if(drop_weapon[weapons[i]][0]) engclient_cmd(id, "drop", drop_weapon[weapons[i]])

  11.         }

  12. }
[/pawn]

Теперь можно сделать чтобы наше оружие можно было выкинуть, и снова подобрать.
[pawn]
  1. // Добавляем w модель (та что лежит на земле)

  2. new w_m79 [] = "models/weapon/w_m79.mdl"

  3.  

  4. public plugin_init()

  5. {

  6.         // Отлавливаем момент, когда объекту присваивается модель

  7.         register_forward(FM_SetModel, "m79_set_model", 1)

  8. }

  9. public plugin_precache()

  10. {

  11.         // Добавляем модель в прекеш

  12.         precache_model(w_m79)

  13. }

  14. // В функцию передаётся id объекта, строка с путём и названием модели

  15. public m79_set_model(ent, model[])

  16. {

  17.         // Делаем условие, что id правильный и название модели w_xm1014

  18.         if(pev_valid(ent) && equali(model, "models/w_xm1014.mdl", 20))

  19.         {

  20.                 // Получаем id владельца

  21.                 static id; id = pev(ent, pev_owner)

  22.                 // Ещё одно условие, что у игрока активна наша переменная, т.е. у него есть наше оружие.

  23.                 if(weapon_m79[id])

  24.                 {

  25.                         // Если всё верно, то заменяем модель на нашу

  26.                         engfunc(EngFunc_SetModel, ent, w_m79)

  27.                         // И сбрасываем переменную

  28.                         weapon_m79[id] = false

  29.                         // Блокируем дальнейшую обработку события

  30.                         return FMRES_SUPERCEDE

  31.                 }

  32.         }

  33.         // Необходимо для компилятора, если модель не та просто выход из функции

  34.         return FMRES_IGNORED

  35. }
[/pawn]
Выкинули, теперь подобрать...
Расписывать не буду почему я выбрал такой способ, скажу так:
Если сейчас подобрать оружие, оно будет "стандартное", стандартная модель, атака(хотя до неё ещё не дошли)
Поэтому убъём 2х зайцев одним событием, запишем id weapon_entity и сравним, поехали.
[pawn]
  1. // Массив куда будем записывать id объектов(оружия) пусть будет максимум 64

  2. new wpn_id[64]

  3.  

  4. public plugin_init()

  5. {

  6.         // Регистрируем событие получения игроком оружия - xm1014

  7.         RegisterHam(Ham_Item_AddToPlayer, "weapon_xm1014", "add_xm1014")

  8. }

  9. public add_xm1014(wpn, id)

  10. {

  11.         // Проверяем есть ли у игрока наше оружие

  12.         if(weapon_m79[id])

  13.         {

  14.                 // Делаем цикл по массиву в котором будем хранить id объектов

  15.                 for(new i = 0; i < sizeof(wpn_id); i++)

  16.                 {

  17.                         // Если ячейка пустая

  18.                         if(!wpn_id[i])

  19.                         {

  20.                                 // Записываем в неё данные

  21.                                 wpn_id[i] = wpn

  22.                                 // И заканчиваем цикл

  23.                                 break

  24.                         }

  25.                 }

  26.         }

  27.         // А если условие не верно, то

  28.         else

  29.         {

  30.                 // Опять же, делаем цикл по массиву с данными

  31.                 for(new i = 0; i < sizeof(wpn_id); i++)

  32.                 {

  33.                         // Сравниваем цифры

  34.                         if(wpn == wpn_id[i])

  35.                         {

  36.                                 // Если совпало, значит это наш гранатомёт, меняем переменную

  37.                                 weapon_m79[id] = true

  38.                                 // Выход

  39.                                 break

  40.                         }

  41.                 }

  42.                

  43.         }

  44. }

  45.  // Теперь сделаем ограничение

  46. // Если последняя ячейка занята

  47. if(wpn_id[charsmax(wpn_id)])

  48. {

  49.         // Сбрасываем переменную

  50.         weapon_m79[id] = false

  51.         // А про эту переменную чуть позже

  52.         limit_m79 = false

  53.         // Говорим игроку, что мол всё, лимит исчерпан, и блокируем событие

  54.         client_print(id, print_center, "Ended m79")

  55.         return FMRES_SUPERCEDE

  56. }

  57. // Ставим это перед циклом
[/pawn]
А чтобы настырный игрок не нагружал сервер бесполезными тырканьями, создадим ещё одну булевую
[pawn]
  1. // Для ограничения покупки, кончилось место в массиве

  2. new bool:limit_m79
[/pawn]
И изменим её там, где у нас кончилось место в массиве, а при выдаче добавим в условие.

На этом с моделями закончим.

Приступим ко второму пункту плана ) Отлов нажатия кнопок и их блокировка.

[pawn]
  1. public plugin_init()

  2. {

  3.         // Регистрируем событие ммм...затрудняюсь сказать чего,

  4.         // но если следовать логике, то связано это с вводом в консоль...

  5.         register_forward(FM_CmdStart, "fw_cmd_start")

  6. }

  7. // В функцию передаётся id игрока, информация о всех введённых данных(думаю так), и что-то про отбор (игроков?)

  8. public fw_cmd_start(id, uc_handle, seed)

  9. {

  10.         // Ставим условие, что в руках у нас xm1014 и переменная верна(т.е. гранатомёт)

  11.         if(weapon_m79[id] && get_user_weapon(id) == CSW_XM1014)

  12.         {

  13.                 // Получаем все нажатые кнопки

  14.                 new buttons = get_uc(uc_handle, UC_Buttons)

  15.                 // Если среди них есть кнопка атаки, то

  16.                 if((buttons & IN_ATTACK))

  17.                 {

  18.                         //блокировка кнопки

  19.                         buttons &= ~IN_ATTACK

  20.                         set_uc(uc_handle, UC_Buttons, buttons)

  21.                        

  22.                         // Здесь будет наша атака

  23.                 }

  24.         }

  25. }
[/pawn]
Кнопка атаки блокирована(вторичная не используется), но остались спрайты и звуки ((
[pawn]
  1. public plugin_init()

  2. {

  3.         // Регистрируем событие обновления данных клиента

  4.         register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)

  5. }

  6. // В функцию передаётся id игрока, информация о оружии, и событии?

  7. public update_client_data(id, sendweapons, cd_handle)

  8. {

  9.         // Опять условие, что это гранатомёт, и если да, то переносим воспроизведение на 1 тысячную секунды вперёд

  10.         if(weapon_m79[id] && get_user_weapon(id) == CSW_XM1014) set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)

  11. }
[/pawn]
Всё, оружие зачищено.
Переходим к атаке.
[pawn]
  1. //Добавляем ещё одну модель, можно взять стандартную из valve\models и качать не придётся

  2. new grenade_model [] = "models/grenade.mdl"

  3. // Добавляем звук

  4. new fire_sound [] = "weapons/m79/m79_fire1.wav"

  5. // Переменная под индекс спрайта

  6. new trail

  7.  

  8. public plugin_precache()

  9. {

  10.         // Закачиваем модель игрокам, на всякий случай, если модели нет, то она скачается

  11.         precache_model(grenade_model)

  12.         // Закачиваем звук игрокам

  13.         precache_sound(fire_sound)

  14.         // Закачиваем спрайт игрокам

  15.         trail = precache_model("sprites/laserbeam.spr")

  16. }

  17. // Атака

  18. public fire_grenade(id)

  19. {

  20.         // Создаём объект

  21.         new grenade = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))

  22.         // Проверяем что его ид больше 0, т.е. объект создался

  23.         if(grenade)

  24.         {

  25.                 // Присваиваем имя объекту

  26.                 set_pev(grenade, pev_classname, "weapon_m79")

  27.                 // Устанавливаем модель

  28.                 engfunc(EngFunc_SetModel, grenade, grenade_model)

  29.                 // Получаем координаты игрока, где-то в районе груди

  30.                 static Float:origin[3]; pev(id, pev_origin, origin)

  31.                 // Проверяем, если у игрока нажата кнопка Ctrl т.е. он сидит, прибавить к высоте 13 юнит

  32.                 // Просто когда игрок сидит, координата высоты получается ровно пол, а нам нужна высота вгляда, центр экрана

  33.                 if(pev(id, pev_button) & IN_DUCK) origin[2] += 13.0

  34.                 // Если игрок стоит, то прибавить 16 юнит. Цифры получены опытным путём)

  35.                 else origin[2] += 16.0

  36.                 // Устанавливаем объекту полученные координаты

  37.                 set_pev(grenade, pev_origin, origin)

  38.                 // Задаём размеры(как хитбокс) зад, лево, низ

  39.                 set_pev(grenade, pev_mins, {-1.0, -1.0, -1.0})

  40.                 // Коробка как бы получается их безразмерных листов, которые придвинули друг к другу,

  41.                 // и сами координаты - удаление от центра двигают эти листы только по одной оси...

  42.                 // Перед, право, верх

  43.                 set_pev(grenade, pev_maxs, {1.0, 1.0, 1.0})

  44.                 // Устанавливаем "плотность" объекта, здесь как бы полый - SOLID_SLIDEBOX

  45.                 set_pev(grenade, pev_solid, 3)

  46.                 // Устанавливаем тип спавна объекта(гравитация), падение до столкновения - MOVETYPE_TOSS

  47.                 set_pev(grenade, pev_movetype, 6)

  48.                 // Устанавливаем владельца

  49.                 set_pev(grenade, pev_owner, id)

  50.                 // Получить скорость игрока и умножить по взгляду на 2000

  51.                 static Float:velocity[3]; velocity_by_aim(id, 2000, velocity)

  52.                 // Устанавливаем полученную скорость объекту

  53.                 set_pev(grenade, pev_velocity, velocity)

  54.                 // Получаем угол из направления скорости(вектор)

  55.                 static Float:flAngle[3]; engfunc(EngFunc_VecToAngles, velocity, flAngle)

  56.                 // Устанавливаем угол объекту

  57.                 set_pev(grenade, pev_angles, flAngle)

  58.                 // Задаём угол при столкновении

  59.                 set_pev(id, pev_punchangle, Float:{0.0, 0.0,0.0})

  60.                 // Воспроизводим звук выстрела

  61.                 emit_sound(grenade, CHAN_WEAPON, fire_sound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

  62.                

  63.                 // Рисуем след

  64.                 message_begin(MSG_BROADCAST, SVC_TEMPENTITY)

  65.                 write_byte(TE_BEAMFOLLOW)       // Тип

  66.                 write_short(grenade)            // Объект

  67.                 write_short(trail)              // id спрайта

  68.                 write_byte(10)                  // Время существования

  69.                 write_byte(3)                   // Толщина линии

  70.                 write_byte(255)                 // Красный

  71.                 write_byte(255)                 // Зелёный

  72.                 write_byte(255)                 // Синий

  73.                 write_byte(255)                 // Яркость

  74.                 message_end()                   // Конец

  75.         }

  76. }
[/pawn]
Добавляем туда где блокировали кнопку:
[pawn]
  1. fire_grenade(id)
[/pawn]
Уже в принципе можно опробовать, только за 1 короткое нажатие выстрела, вылетает 10 гранат, потому, что FM_CmdStart работает с частотой фпс сервера.
Нужно поставить ограничение по времени.
[pawn]
  1. // Переменная для ограничения атаки

  2. new Float:shot_time[33]

  3.  

  4. // И ставим вот такой нехитрый кодец после блокировки кнопки:

  5.  

  6. //блокировка кнопки

  7. buttons &= ~IN_ATTACK

  8. set_uc(uc_handle, UC_Buttons, buttons)

  9.  

  10. // Регистрируем статическую переменную, и записываем в неё время

  11. // Чем меньше дёргаем функции тем меньше нагрузки, а здесь используется 2 раза

  12. static Float:gametime; gametime = get_gametime()

  13. // Если время записанное в переменную меньше или равно действительному, то выполнить

  14. if(shot_time[id] <= gametime)

  15. {

  16.         // Здесь будет наша атака

  17.         fire_grenade(id)

  18.         // Теперь задаём переменной текущее время + время задержки

  19.         // Есливы подумали а как же срабатывает условие при первом выстреле

  20.         // когда ещё не записали время в переменную, всё просто, изначально все переменные имеют значение 0 (или false)

  21.         shot_time[id] = gametime + 3.2 // время на задержку получаем из модели, количество кадров делим на фпс

  22. }
[/pawn]
Ну и буквально последний штришок.
Взрыв, урон.

[pawn]
  1.  

  2. // Задаём максимальный урон

  3. new const Float:damage = 100.0

  4. // Задаём радиус поражения

  5. new const Float:radius = 200.0

  6.  

  7. public plugin_init()

  8. {

  9.         // Отлавливаем касание объектов

  10.         register_forward(FM_Touch, "grenade_touch", 1)

  11. }

  12. // В функцию передаются id того кто коснулся, и id того кого коснулись.Т.к. у нас граната касается, то она и идёт первая.

  13. public grenade_touch(grenade, ent)

  14. {

  15.         // Проверяем что объект существует. Если нет, то выходим

  16.         if(!pev_valid(grenade)) return FMRES_IGNORED

  17.         // Получаем имя объекта, не факт, что это она, это может быть и игрок

  18.         new gclass[33]; pev(grenade, pev_classname, gclass, 32)

  19.         // А теперь сравниваем полученное имя с тем, что мы задали объекту, когда его создали, если совпало, идём дальше

  20.         if(equal(gclass, "grenade_m79"))

  21.         {

  22.                 // Получаем владельца, id игрока который выстрелил

  23.                 new owner = pev(grenade, pev_owner)

  24.                 // Получаем координаты гранаты

  25.                 new Float:origin[3]; pev(grenade, pev_origin, origin)

  26.        

  27.                 // Создаём зрыв, само пламя

  28.                 engfunc(EngFunc_MessageBegin,MSG_PVS,SVC_TEMPENTITY,origin,0)

  29.                 write_byte(TE_EXPLOSION)                // Тип

  30.                 engfunc(EngFunc_WriteCoord,origin[0])   // позиция X

  31.                 engfunc(EngFunc_WriteCoord,origin[1])   // позиция Y

  32.                 engfunc(EngFunc_WriteCoord,origin[2])   // позиция Z

  33.                 write_short(explode)                    // Индекс спрайта

  34.                 write_byte(30)                          // Масштаб

  35.                 write_byte(15)                          // Частота кадров

  36.                 write_byte(0)                           // Флаг

  37.                 message_end()                           // Конец

  38.                 // Получаем имя класса второго объекта, которого коснулась граната

  39.                 new classname[33]; pev(ent, pev_classname, classname, 32)

  40.                 //Иконка xm при убийстве

  41.                 set_pev(grenade, pev_classname, "weapon_xm1014")

  42.                 // Если имя player - граната попала в игрока

  43.                 // Наверное это лишнее, потому, что игрока потом ещё раз долбанёт )

  44.                 if(equal(classname, "player"))

  45.                 {

  46.                         // Проверяем, что он жив, не в одной команде с владельцем гранаты, и если это так, то наносим урон

  47.                         if(is_user_alive(ent) && get_user_team(ent) != get_user_team(owner)) ExecuteHamB(Ham_TakeDamage, ent, grenade, owner, damage, DMG_BULLET)

  48.                 }

  49.                 // Если нет, и граната попала в ящик, которые ломаются при взрыве, то сломать его

  50.                 else if(equal(classname, "func_breakable")) dllfunc(DLLFunc_Use, ent, owner)

  51.                 // Граната просто воткнулась в карту, создаём урон в радиусе

  52.                 // Регистрируем переменную, присваиваем ей -1 (неизвесно кого искать)

  53.                 new target = -1

  54.                 // Теперь делаем цикл с поиском объектов в радиусе, вводим координаты гранаты, радиус

  55.                 while((target = engfunc(EngFunc_FindEntityInSphere, target, origin, radius)))

  56.                 {

  57.                         // Если объект жив и не в одной команде с владельцем

  58.                         if(is_user_alive(target) && get_user_team(target) != get_user_team(owner))

  59.                         {

  60.                                 // Получаем координаты жертвы

  61.                                 new Float:v_origin[3]; pev(target, pev_origin,v_origin)

  62.                                 // Расчёт наносимого урона

  63.                                 // От радиуса отнимаем дистанцию и умножаем на урон делённый на радиус

  64.                                 /*

  65.                                 дистанция 100, урон 100, радиус 200  100/200 = 0.5   200 - 100 = 100   100 * 0.5 = 50 урон

  66.                                 дистанция 50, урон 100, радиус 200  100/200 = 0.5   200 - 50 = 150   150 * 0.5 = 75 урон

  67.                                 дистанция 30, урон 100, радиус 200  100/200 = 0.5   200 - 30 = 170   170 * 0.5 = 85 урон

  68.                                 */

  69.                                 new Float:damag = (radius - get_distance_f(origin, v_origin)) * (damage / radius)

  70.                                 // Наносим урон

  71.                                 ExecuteHamB(Ham_TakeDamage, target, grenade, owner, damag, DMG_BULLET)

  72.                         }

  73.                 }

  74.                 // Удаляем гранату

  75.                 engfunc(EngFunc_RemoveEntity, grenade)

  76.         }

  77.         // Возврат

  78.         return FMRES_IGNORED

  79. }
[/pawn]
Анимация

[pawn]
  1. // Зарегистрируем перечисления с названиями анимаций в том порядке как они идут в модели

  2. // так-то можно и без этого, но так нам же будет понятнее, вместо названий анимаций просто подставляются цифры ...

  3. enum

  4. {

  5.         idle,   // 0

  6.         shoot,  // 1

  7.         reload, // 2

  8.         draw    // 3

  9. }

  10. // Этот сток куда-нибудь в конец плагина. Проигрывание анимации оружия

  11. stock play_weapon_anim(id, sequence)

  12. {

  13.         set_pev(id, pev_weaponanim, sequence)

  14.         message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, id)

  15.         write_byte(sequence)

  16.         write_byte(pev(id, pev_body))

  17.         message_end()

  18. }

  19. // А так будем воспроизводить, поставим это сразу после того как заменили модель оружия

  20. play_weapon_anim(id, draw)

  21.  

  22. // Воспроизводим анимацию выстрела там где блокируем нажатие кнопки атаки

  23. play_weapon_anim(id, shoot)

  24.  
[/pawn]

И последнее, делаем перезарядку, и кончающиеся патроны...

...статья не дописана, допишу завтра...

Хоть тут и описан принцип, но о том как было бы лучше сделать, с удовольствием прочту...
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Делаем своё оружие.

Сообщение KORD_12.7 » 29 дек 2013, 13:35

Отличная статья про то, как не надо писать свою пушку, без обид. :crazy:

_http://aghl.ru/ - Half-Life и Adrenaline Gamer: за пределами возможного
Аватара пользователя
KORD_12.7
Скриптер
 
Сообщения: 298
Зарегистрирован: 28 сен 2009, 10:14
Откуда: Владивосток
Благодарил (а): 142 раз.
Поблагодарили: 257 раз.
Опыт программирования: Больше трех лет
Языки программирования: Half-Life
Opposing Force
Adrenaline Gamer
Counter-Strike

Re: Делаем своё оружие.

Сообщение артист666 » 29 дек 2013, 15:22

KORD_12.7 писал(а):Отличная статья про то, как не надо писать свою пушку, без обид. :crazy:


Я думал только про это могут какашками закидать :crazy:
артист666 писал(а):Расписывать не буду почему я выбрал такой способ, скажу так:
Если сейчас подобрать оружие, оно будет "стандартное", стандартная модель, атака(хотя до неё ещё не дошли)
Поэтому убъём 2х зайцев одним событием, запишем id weapon_entity и сравним, поехали.
[pawn]
  1. // Массив куда будем записывать id объектов(оружия) пусть будет максимум 64

  2. new wpn_id[64]

  3.  

  4. public plugin_init()

  5. {

  6.         // Регистрируем событие получения игроком оружия - xm1014

  7.         RegisterHam(Ham_Item_AddToPlayer, "weapon_xm1014", "add_xm1014")

  8. }

  9. public add_xm1014(wpn, id)

  10. {

  11.         // Проверяем есть ли у игрока наше оружие

  12.         if(weapon_m79[id])

  13.         {

  14.                 // Делаем цикл по массиву в котором будем хранить id объектов

  15.                 for(new i = 0; i < sizeof(wpn_id); i++)

  16.                 {

  17.                         // Если ячейка пустая

  18.                         if(!wpn_id[i])

  19.                         {

  20.                                 // Записываем в неё данные

  21.                                 wpn_id[i] = wpn

  22.                                 // И заканчиваем цикл

  23.                                 break

  24.                         }

  25.                 }

  26.         }

  27.         // А если условие не верно, то

  28.         else

  29.         {

  30.                 // Опять же, делаем цикл по массиву с данными

  31.                 for(new i = 0; i < sizeof(wpn_id); i++)

  32.                 {

  33.                         // Сравниваем цифры

  34.                         if(wpn == wpn_id[i])

  35.                         {

  36.                                 // Если совпало, значит это наш гранатомёт, меняем переменную

  37.                                 weapon_m79[id] = true

  38.                                 // Выход

  39.                                 break

  40.                         }

  41.                 }

  42.                

  43.         }

  44. }
[/pawn]


Хотел по модели сначала сделать...не получилось :-D
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Делаем своё оружие.

Сообщение Retro-kolt Lincoln » 30 дек 2013, 01:29

KORD_12.7 писал(а):Отличная статья про то, как не надо писать свою пушку, без обид. :crazy:

А если я статью буду пилить, вы мне поможете?
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

Re: Делаем своё оружие.

Сообщение igoogle » 30 дек 2013, 02:12

да ладно =)за то старался делал
Аватара пользователя
igoogle
 
Сообщения: 184
Зарегистрирован: 01 май 2013, 20:49
Благодарил (а): 45 раз.
Поблагодарили: 17 раз.
Опыт программирования: Меньше недели

Re: Делаем своё оружие.

Сообщение crash94 » 30 дек 2013, 08:19

за старание +
Аватара пользователя
crash94
 
Сообщения: 683
Зарегистрирован: 25 фев 2010, 16:34
Забанен
Благодарил (а): 80 раз.
Поблагодарили: 317 раз.

Re: Делаем своё оружие.

Сообщение артист666 » 31 дек 2013, 01:13

Я не старался :-) Просто раскидал готовый плагин на части, и всё подписал...

Если считаете, что есть ошибки, или знаете как лучше - пишите...
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Делаем своё оружие.

Сообщение Leonidddd » 02 янв 2014, 06:20

И тишина...


P.S.Мне было бы интересно посмотреть на мастер-класс скриптеров,которые знают как это оптимизировать до предела.Хотя,думаю им это не выгодно.Т.к. идеи сопрут и забудут о них.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Делаем своё оружие.

Сообщение Retro-kolt Lincoln » 02 янв 2014, 20:00

Опытные люди очень часто не хотят делится своим опытом, причиной тому большое количество потраченного времени на обучение, а кто-то хочет за месяц всё знать, понимаете о чём речь?
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

Re: Делаем своё оружие.

Сообщение Safety1st » 02 янв 2014, 20:43

Не забываем, что опытным людям может быть просто жалко времени. Их-то так - на блюдечке - не обучали.
Leonidddd писал(а):им это не выгодно.Т.к. идеи сопрут и забудут о них.

Так думают только те 'отцы', которые на паблик не работают. Они по определению не будут тратить время на составление гайдов - им просто это нахер не нужно.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life


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

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

Сейчас этот форум просматривают: Nameless1337 и гости: 7