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

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

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

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

Видно ли игрока

, Хочу сделать по человечески
Статус пользователя ssx
сообщение 15.3.2017, 2:00
Сообщение #1


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Не получается организовать нормальную проверку видно ли игрока.
(хочу написать нормальное отображение попадания в хитбокс если хоть немного видно противника)

Нужно чтобы если хоть немножко видно игрока - возвращалось значение true

Перепробовал:
1. if(!(ExecuteHam(Ham_FVisible, pid, id))) в Ham_TakeDamage и в fw_TraceAttack_Pre - работает если дистанция не большая , и через раз если слишком маленькая - не понятно в общем что за глюки.
2. Ham_FVecVisible - не заработало у меня , то сервер краш то просто пофиг.
3. Код:
stock bool:fm_is_ent_visible(index, entity, ignoremonsters = 0) {
new Float:start[3], Float:dest[3];
pev(index, pev_origin, start);
pev(index, pev_view_ofs, dest);
xs_vec_add(start, dest, start);

pev(entity, pev_origin, dest);
engfunc(EngFunc_TraceLine, start, dest, ignoremonsters, index, 0);

new Float:fraction;
get_tr2(0, TR_flFraction, fraction);
if (fraction == 1.0 || get_tr2(0, TR_pHit) == entity)
return true;

return false;
}

Нужно больше половины чтобы видно было
4. Код:
// fakemeta_util.inc code with some replaced natives
stock fm_is_ent_visible( index, entity, ignoremonsters = 0 ) {
new Float:start[3], Float:dest[3]
entity_get_vector( index, EV_VEC_origin, start )
entity_get_vector( index, EV_VEC_view_ofs, dest )
xs_vec_add( start, dest, start )

const GLOBAL_TRACERESULT_HANDLE = 0

entity_get_vector( entity, EV_VEC_origin, dest )
engfunc( EngFunc_TraceLine, start, dest, ignoremonsters, index, GLOBAL_TRACERESULT_HANDLE )

return get_tr2( GLOBAL_TRACERESULT_HANDLE, TR_pHit ) == entity
}

Так же если голова торчит или немного видно то засчитывает как не видишь .
5.
Много кода а толку как с остальных
Код:
bool:can_see_fm(entindex1, entindex2)
{
if (!entindex1 || !entindex2)
return false
// new ent1, ent2

if (pev_valid(entindex1) && pev_valid(entindex1))
{
new flags = pev(entindex1, pev_flags)
if (flags & EF_NODRAW || flags & FL_NOTARGET)
{
return false
}

new Float:lookerOrig[3]
new Float:targetBaseOrig[3]
new Float:targetOrig[3]
new Float:temp[3]

pev(entindex1, pev_origin, lookerOrig)
pev(entindex1, pev_view_ofs, temp)
lookerOrig[0] += temp[0]
lookerOrig[1] += temp[1]
lookerOrig[2] += temp[2]

pev(entindex2, pev_origin, targetBaseOrig)
pev(entindex2, pev_view_ofs, temp)
targetOrig[0] = targetBaseOrig [0] + temp[0]
targetOrig[1] = targetBaseOrig [1] + temp[1]
targetOrig[2] = targetBaseOrig [2] + temp[2]

engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the had of seen player
if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
{
return false
}
else
{
new Float:flFraction
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the body of seen player
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2] - 17.0
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the legs of seen player
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return true
}
}
}
}
}
return false
}

Так же.
6. if(!is_visible( attacker, iVictim ) ) - так же если более половины видно.
7. if(!fm_is_ent_visible( attacker, iVictim ) ) - то же самое .

Вопрос знатокам! Как сделать чтобы если хоть мизинчик будет видно от противника - возвращало true ?

Отредактировал: ssx, - 15.3.2017, 2:02


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя VEN
сообщение 15.3.2017, 12:12
Сообщение #2
Стаж: 9 лет 1 месяц

Сообщений: 418
Благодарностей: 129
Полезность: 199

Это не сделать нормально, готовых функций, точно отрабатывающих это нет.
Насколько помню готовая функция проверяет только виден ли центр игрока.

Нужно делать трассировку через каждый небольшой угол, ну допустим 0.5 по горизонтали и вертикали, то есть очень много и очень часто.
Автор Block WallHack выкладывал готовый API для этого - "Проверка виден ли игрок"
Именно так и сделан WHBlocker.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 15.3.2017, 12:55
Сообщение #3


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

VEN,
Дай ссылку плиз на WHBlocker API , не могу нагуглить.


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя VEN
сообщение 15.3.2017, 13:13
Сообщение #4
Стаж: 9 лет 1 месяц

Сообщений: 418
Благодарностей: 129
Полезность: 199

Специально же название статьи написал) - "Проверка виден ли игрок"
Cкрытый текст
http://amx-x.ru/viewtopic.php?p=358
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя esterio
сообщение 15.3.2017, 14:22
Сообщение #5
Стаж: 13 лет
Город: Украина

Сообщений: 266
Благодарностей: 215
Полезность: 627

Block WallHack != WHBlocker


Ми будемо вбивати росіян у будь-якій точці світу до повної перемоги України
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 16.3.2017, 11:20
Сообщение #6


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

VEN,
Слишком сложно для меня, не осилил.

Цитата
Block WallHack != WHBlocker

Печалька, я уже подумал "наконец-то в WHblocker'е запилили API"


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 17.3.2017, 0:25
Сообщение #7


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Второй день потратил таки не разобравшись как сделать нормальную проверку видно ли любую часть тела противника.

Вот нашел как определять позицию хитбокса игрока
Код:
new Float:origin[3], Float:angles[3]
engfunc(EngFunc_GetBonePosition, id, PLAYERBONE_HEAD, origin, angles)

bone-константы
Код
#define PLAYERBONE_PELVIS 1
#define PLAYERBONE_SPINE 2
#define PLAYERBONE_SPINE1 3
#define PLAYERBONE_SPINE2 4
#define PLAYERBONE_SPINE3 5
#define PLAYERBONE_NECK 6
#define PLAYERBONE_HEAD 7
#define PLAYERBONE_L_CLAVICLE 9
#define PLAYERBONE_L_UPPERARM 10
#define PLAYERBONE_L_FOREARM 11
#define PLAYERBONE_L_HAND 12
#define PLAYERBONE_L_FINGER0 13
#define PLAYERBONE_L_FINGER01 14
#define PLAYERBONE_L_FINGER1 15
#define PLAYERBONE_L_FINGER11 16
#define PLAYERBONE_L_THIGH 40
#define PLAYERBONE_L_CALF 41
#define PLAYERBONE_L_FOOT 42
#define PLAYERBONE_R_CLAVICLE 23
#define PLAYERBONE_R_UPPERARM 24
#define PLAYERBONE_R_FOREARM 25
#define PLAYERBONE_R_HAND 26
#define PLAYERBONE_R_FINGER0 27
#define PLAYERBONE_R_FINGER01 28
#define PLAYERBONE_R_FINGER1 29
#define PLAYERBONE_R_FINGER11 30
#define PLAYERBONE_R_THIGH 46
#define PLAYERBONE_R_CALF 47
#define PLAYERBONE_R_FOOT 48


Вот как сделать чтобы в цикле сравнило трейсы позиции от глаз с позициями хитбоксов противника ?


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 17.3.2017, 2:57
Сообщение #8
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

ssx,

Не хитбокса, а кости. Хитбоксы в трейсе и дамаге и их всего десяток. GetBonePosition должна определять оригины костей, правда я её не использовал на практике, а вот сработает ли на них трейс, это уже надо тестировать.

У фейкметы есть EngFunc_CheckVisibility как раз для этих целей и ещё EngFunc_EntitiesInPVS: https://forums.alliedmods.net/showpost.php?...mp;postcount=68 правда на счет последнего сомневаюсь. И ещё можно пощупать FM_TraceLine и возможно тут что-то найдешь: https://wiki.alliedmods.net/FakeMeta_Functi...ed_Descriptions там есть много примеров использования функций, поиска костей, и т.д.

Отредактировал: SISA, - 17.3.2017, 3:06
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя ssx
сообщение 17.3.2017, 16:02
Сообщение #9


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Нашел инфу по EngFunc_CheckVisibility а вот как применить - не понятно для меня.
Visibility Functions
EngFunc_CheckVisibility

This function is used to check if an entity is in your PVS.

It can be used on all entities except worldspawn.
Usage

This function has a parameter that must be obtained in a special way, the pset parameter. Note: The parameter is player only, that means that if you get pset for example for a player that has the id 1. When you use this function on an entity it will check whether that entity is in PVS of the Player id 1.

Код:
new g_cl_pset[33]

public plugin_init(id)
{
register_forward(FM_AddToFullPack, "pfw_atfp", 1)
}

public pfw_atfp(es, e, ent, host, flags, player, set)
{
g_cl_pset[host] = set

return FMRES_IGNORED
}

stock is_ent_in_player_pvs(id, entity)
{
return engfunc(EngFunc_CheckVisibility, entity, g_cl_pset[id])
}

stock get_pvs_players(id, players[32], num, flags[], team[])
{
if (!is_user_connected(id))
return 0

get_players(players, num, flags, team)

for (new i=0;i<num;i++)
{
if (!is_ent_in_player_pvs(id, players[i]))
{
num--;

for (new j=i;j<num;j++)
{
players[j] = players[j+1]
}

i--
}
}

return 1
}

Тут циклом проганяет игроков. А мне нужно конкретно сравнивать attacer и victim .
Если конечно эта функция проверяет нормально а не только центр игрока и т д как остальные функции...

Уже мозг плавится, третий день никак не могу разобраться как сделать проверку нормальную.

Посмотрел я про bone (кости) и видно что точки там по центру хитбоков. Что не очень и подходит ибо если модель немного видно это не значит что точку bone тоже видно.

Пока что, максимум что более менее работает так это переделка fm_is_ent_visible
код стока
Код:
stock bool:fm_is_ent_visible1(index, entity, ignoremonsters = 0) {
new Float:start[3], Float:dest[3];
// pev(index, pev_origin, start);

static iorigin[3]
get_user_origin(index, iorigin, 3)
IVecFVec(iorigin, start)

static iorigin1[3]
get_user_origin(index, iorigin1, 4) // оригин хитбокса куда попала пуля
IVecFVec(iorigin1, dest)

// pev(index, pev_view_ofs, dest);
// xs_vec_add(start, dest, start);

pev(entity, pev_origin, dest);
engfunc(EngFunc_TraceLine, start, dest, ignoremonsters, index, 0);

new Float:fraction;
get_tr2(0, TR_flFraction, fraction);
if (fraction == 1.0 || get_tr2(0, TR_pHit) == entity)
return true;

return false;
}

Так хоть если торчит левая нога и по ней стрельнуть то напишет что попал в левую ногу , при обычной проверки возврат был бы что не виден игрок т.к. от центра противника а не от хитбокса.

П.С. у кого есть контакты s1lent'a ? может он подскажет как на АМХХ написать нормальную проверку.. или же в ВХблокер запилит API для АМХХ ..


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 17.3.2017, 17:36
Сообщение #10
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Цитата
А мне нужно конкретно сравнивать attacer и victim .


В какой функции или при каком действии ?

Отредактировал: SISA, - 17.3.2017, 17:37
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 17.3.2017, 18:26
Сообщение #11


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

SISA,
Либо в
Код:
register_event("Damage", "fwd_damage", "b", "2!0", "3=0")

public fwd_damage(iVictim)
{
new weapon, bodypart, attacker = get_user_attacker(iVictim,weapon,bodypart)

if(!fm_is_ent_visible1( attacker, iVictim ) )
{
return PLUGIN_HANDLED
}

if(!g_Only_HS[attacker])
{
switch(bodypart)
{
case 1:
{
set_hudmessage( 255, 0, 0, -1.0, 0.4, 0, 1.0, 1.0, 0.01, 0.02, -1 )
show_hudmessage(attacker, "ГОЛОВА")
}
...

Либо в перенести отображение в какой хитбокс попал (если хоть немного видно противника)
Код:
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Pre", 0); // в тот код что ты мне для ONLY HS написал.

public fw_TraceAttack_Pre(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_bits)
{
// Если включил игрок режим Only HS
if(!g_Only_HS[attacker])
return HAM_IGNORED;

// Если Жертва или Аттакер Не Валидны
if(!is_user_valid(victim) || !is_user_valid(attacker))
return HAM_IGNORED;

// Игнорируем нож
static weapon; weapon = get_pdata_int(get_pdata_cbase(attacker, 373, 5), 43, 4);
if(weapon == CSW_KNIFE)
return HAM_IGNORED;

// Находим номер Хитбокса
new iHitGroup = get_tr2(tracehandle, TR_iHitgroup);


Отредактировал: ssx, - 17.3.2017, 18:27


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fl0werD
сообщение 18.3.2017, 0:51
Сообщение #12
Стаж: 9 лет 2 месяца

Сообщений: 155
Благодарностей: 114
Полезность: 692

http://amx-x.ru/viewtopic.php?p=358
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fl0werD
сообщение 20.3.2017, 21:09
Сообщение #13
Стаж: 9 лет 2 месяца

Сообщений: 155
Благодарностей: 114
Полезность: 692

https://forums.alliedmods.net/showthread.php?t=163946
Там есть код. В SentryGun_AI, сток BestVisibleEnemy.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: