Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Просьба проверить на корректность/оптимальность кода

, с наименьшей нагрузкой
Статус пользователя Yaroslav
сообщение 1.6.2015, 13:59
Сообщение #1


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Задача.
1. Ставим игроку с указанным флагом свою модель ножа.
2. Нож наносит урон х2.

Скрытый текст

Код:

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>

#pragma semicolon 1
#define VERSION "1.0.0"

enum eModels
{
View,
Player
};

new const g_szModels[eModels][] =
{
"models/v_knife.mdl",
"models/p_knife.mdl"
};

new g_iMaxPlayers;
new bool: g_bIsAdmin[33];

public plugin_precache()
{
for(new eModels: i = eModels: 0; i < eModels; i++)
precache_model(g_szModels[i]);
}

public plugin_init()
{
register_plugin("Prise Knife", VERSION, "Ugums");
register_event("CurWeapon", "EventCurWeapon", "be", "1=29");
RegisterHam(Ham_TakeDamage, "player", "Player_TakeDamage");
g_iMaxPlayers = get_maxplayers();
}

public client_authorized(id)
{
if(get_user_flags(id) & ADMIN_LEVEL_H)
g_bIsAdmin[id] = true;

else
g_bIsAdmin[id] = false;
}

public EventCurWeapon(id)
{
if(g_bIsAdmin[id])
{
set_pev(id, pev_viewmodel2, g_szModels[View]);
set_pev(id, pev_weaponmodel2, g_szModels[Player]);
}
}

public Player_TakeDamage(id, inflictor, attacker, Float:damage, damagebits)
{
if( !(1 <= attacker <= g_iMaxPlayers) || attacker != inflictor || get_user_weapon(attacker) != CSW_KNIFE)
return HAM_IGNORED;
else if (get_user_flags(id) & ADMIN_LEVEL_H)
SetHamParamFloat(4, damage * 2);
return HAM_HANDLED;
}



Заранее благодарен за компетентный ответ.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Legenda
сообщение 1.6.2015, 14:03
Сообщение #2


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

как минимум не верно с точки зрения логики
get_user_weapon(attacker)
это оружие в руках
чисто теоретически можно успеть нанести урон и поменять оружие раньше, чем amxx событие отработает
нафига нам тогда знать что в руках? если можно получить оружие, которым нанесен урон?
второй параметр Ham_TakeDamage это вроде бы само оружие

else if (get_user_flags(id) & ADMIN_LEVEL_H)
зачем?

cs_get_user_team(attacker) != CS_TEAM_CT
зачем?

get_user_weapon(attacker) != CSW_KNIFE
зачем?

код явно копирован откуда-то
оригинал ниже
Код:
public Player_TakeDamage(id, inflictor, attacker, Float:damage, damagebits)
{
if( !(1 <= attacker <= g_iMaxPlayers)
|| attacker != inflictor
|| cs_get_user_team(attacker) != CS_TEAM_CT
|| get_user_weapon(attacker) != CSW_KNIFE )
return HAM_IGNORED;

SetHamParamFloat(4, damage * 2); //Here knife does double damage, ofc you can set it to 0.0 or anything.
return HAM_HANDLED;
}


вообще код кривой и явно с нубо зм копирован

Player_TakeDamage нужно переделать
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 1.6.2015, 14:13
Сообщение #3


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Цитата(Legenda @ 1.6.2015, 15:03) *

Да-да, искал решение на оленях, все верно кусок оттуда.
cs_get_user_team(attacker) != CS_TEAM_CT - у меня этого нет, это в оригинале есть, там же выше написано в теме на оленях зачем эта проверка))

else if (get_user_flags(id) & ADMIN_LEVEL_H)
Если тут этого не будет, урон будет у всех игроков с ножей, разве нет?

Кривой код, да. Другого решения не нашел, поэтому и обратился за помощью :)

Отредактировал: Yaroslav, - 1.6.2015, 14:14
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Stimul1
сообщение 1.6.2015, 14:30
Сообщение #4


Стаж: 13 лет

Сообщений: 227
Благодарностей: 262
Полезность: 977

Yaroslav, используй Ham_Item_Deploy вместо CurWeapon.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 2.6.2015, 20:10
Сообщение #5


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Код с нубо зм сервера писал Коннор :)))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 2.6.2015, 21:19
Сообщение #6
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Yaroslav, конкретные строчки мб и писал ConnorMrLeod, но ты их применил не в том месте smile.gif

Например, так обычно не делается: в эвенте Ham'ом оперировать. Или чисто эвент и 'legacy' get_user_weapon() и т.п. из amxmodx.inc, либо Ham-форвард и Ham/FM-нативы.

Расслабься, я тебе сегодня-завтра готовый блок волшебного кода напишу good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 2.6.2015, 21:26
Сообщение #7
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

lastinv;lastinv и хоп обычная модель ножа.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 2.6.2015, 21:35
Сообщение #8
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата([WPMG]PRoSToTeM@ @ 2.6.2015, 22:26) *
lastinv;lastinv и хоп обычная модель ножа.

Знатный баг был на моде Predator smile.gif
Умники ставили дефолтную модель ножа - с ней сподручнее (привычнее) народ резать good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 4.6.2015, 11:50
Сообщение #9


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Цитата(Safety1st @ 2.6.2015, 22:19) *
Yaroslav, конкретные строчки мб и писал ConnorMrLeod, но ты их применил не в том месте smile.gif

Например, так обычно не делается: в эвенте Ham'ом оперировать. Или чисто эвент и 'legacy' get_user_weapon() и т.п. из amxmodx.inc, либо Ham-форвард и Ham/FM-нативы.

Расслабься, я тебе сегодня-завтра готовый блок волшебного кода напишу good.gif

Спасибо, Дим. Жду с нетерпением :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 5.6.2015, 8:48
Сообщение #10
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Хах, мы с Legenda ошибались smile.gif

Цитата(Legenda @ 1.6.2015, 15:03) *
как минимум не верно с точки зрения логики
get_user_weapon(attacker)
это оружие в руках
чисто теоретически можно успеть нанести урон и поменять оружие раньше, чем amxx событие отработает
нафига нам тогда знать что в руках? если можно получить оружие, которым нанесен урон?

В случае 'прямого' оружия невозможно выстрелить (или ударить ножом) и успеть его сменить, пока пуля летит: в CS они не летают, дамаг наносится мгновенно. Сначала TraceAttack, затем, если есть hit - вызываем TakeDamage. Поэтому достаточно использовать всего лишь одну простую нативу, предварительно убедившись, что дамаг нанесён 'прямым' оружием, которое по определению 'равно' текущему.

Цитата(Legenda @ 1.6.2015, 15:03) *
второй параметр Ham_TakeDamage это вроде бы само оружие

Только для 'непрямого' оружия, которое наносит урон не сразу после клика мыши: HE или C4, например.

Цитата(Legenda @ 1.6.2015, 15:03) *
Player_TakeDamage нужно переделать

Цитата(Safety1st @ 2.6.2015, 22:19) *
Yaroslav, конкретные строчки мб и писал ConnorMrLeod, но ты их применил не в том месте smile.gif

Оставил функцию, как и была: там всё по уму. После Item_Deploy использовать оружие нельзя ещё полсекунды, за это время инфа, которой пользуется get_user_weapon(), уже успеет обновиться.
--

Вот как-то так. Yaroslav, проверяй; может, что добавим. А потом опубликую на Складе.

[attachment=33645:prize_knife.sma]

Отредактировал: Safety1st, - 5.6.2015, 12:24
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 5.6.2015, 9:58
Сообщение #11


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

в таком случаи не прав был)

Цитата
Только для 'непрямого' оружия, которое наносит урон не сразу после клика мыши

не знал, думал всегда второе параметр будет указывать на id оружия

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 5.6.2015, 11:21
Сообщение #12


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Safety1st
Проверил, все работает как часы, спасибо большое Дим.
Багов пока не выявил. Модификатор урона работает корректно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 5.6.2015, 11:26
Сообщение #13
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Yaroslav, можно красивый скринчик убийства с ножа? Ну, за мгновение спустя после килла, когда видна падающая моделька smile.gif
По высоте узкий, но широкий (искусственно растянутый). Пригодился бы для оформления поста, школота одобряет crazy.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 5.6.2015, 11:44
Сообщение #14


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Прикрепленное изображение
Прикрепленное изображение
Модельку надо?)

Отредактировал: Yaroslav, - 5.6.2015, 11:46
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 5.6.2015, 12:24
Сообщение #15
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Обойдутся, пусть ищут сами. Разнообразия больше будет smile.gif
Плагин перекочевал сюда.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: