CustomGames.ru - Dota 2 пользовательские игры

Триггеры средствами lua.

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Триггеры средствами lua.
« : 28-02-2017, 04:53:07 »
Итак, мы знаем что триггер можно создать непосредственно из Hammer'a (область которая бы реагировала на что-нибудь), но что если ты не знаешь какая именно область тебе нужна. Типа она все время меняется, как отследить такое? Нашел в доках валве функцию CreateTrigger, которая возвращает некий AABB trigger.
Код
CreateTriggerRadiusApproximate	handle CreateTriggerRadiusApproximate(Vector Vector_1, float float_2)
Как я понял это и есть то что мне нужно, ибо можно создать триггер через юнита, взяв его AbsOrigin и некий радиус, но доступно всего 3 функции для работы с ним:
Код
Disable	void Disable()	Disable the trigger
Enable void Enable() Enable the trigger
IsTouching bool IsTouching(handle hEnt) Checks whether the passed entity is touching the trigger.
Первые 2 как мы видим отвечают за включение/выключение триггера, а вот 3-я , как я понял, возвращает true/false если данный entity "дотронулся" триггера.
Перепробовал все, никак не получается. IsTouching() всегда возвращает false, даже если дать entity, на котором создаешь сам триггер, hundle триггера через DebugPrintTable() возвращает userdata в который никак не заглянуть. Может быть есть еще что то, что я упустил. Идеи?

На данный момент использую обычный триггер из хамера, и переношу его через SetAbsOrigin() туда куда мне нужно. Но хотелось бы автоматизировать это полностью(без создания ентити в хамере)
« Последнее редактирование: 28-02-2017, 04:59:51 от RecoveryIt »

Оффлайн Илья

  • Супермодератор
  • 2075
  • Мощь: 19
Re: Триггеры средствами lua.
« Ответ #1 : 28-02-2017, 09:09:55 »
Покажи userdata (что тебе в консоли выводит).
Разве она не таблица? Ключи и их значения не глянуть?

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #2 : 28-02-2017, 09:34:25 »
Покажи userdata (что тебе в консоли выводит).
Разве она не таблица? Ключи и их значения не глянуть?

Выводит лишь 1 значение, userdata. На сколько я знаю , в userdata нельзя заглянуть.
Но вроде можно попробовать перебором ключей типа так:
пусть переменная somevar наш userdata
somevar.name , somevar.id , somevar.count и т.д.
Хотя точно не помню, вроде я так с модификаторами делал ;D
« Последнее редактирование: 28-02-2017, 09:38:07 от RecoveryIt »

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #3 : 28-02-2017, 09:45:25 »
Вот вывод в консоль, и кстати я только что заметил что верхняя строчка которую выводит консоль, говорит нам о том что сервер не может запрекешить модель триггера с типом multiple (такой тип в хамере можно создать) мб модельку ему прифигачить через SetModel()  ;D

Код
[ W Entity System        ]: Attempting to precache model for entity 358 [trigger_multiple] at -515.44 -131.20 128.00, but model name is NULL
[   VScript              ]: table: 0x033817e0                         ----------- это DebugPrint() триггера
[   VScript              ]: __self: userdata: 0x03381820     ----------- это DebugPrintTable() триггера

Вот кстати один из созданых триггеров, как видно из параметров , он типо включен.
imgur.com/a/a2iys
« Последнее редактирование: 28-02-2017, 10:07:59 от RecoveryIt »

Оффлайн Илья

  • Супермодератор
  • 2075
  • Мощь: 19
Re: Триггеры средствами lua.
« Ответ #4 : 28-02-2017, 10:15:48 »
Я не знаю, как у BMD реализован DebugPrint(), может там и есть то, что я тебе посоветую попробовать дальше, но попробуй глянуть так:

Код
for k,v in pairs(userdata) do
    print(k,v)
end

Оффлайн CryDeS

  • Друзья CG
  • 1211
  • Мощь: 12
Re: Триггеры средствами lua.
« Ответ #5 : 28-02-2017, 10:18:49 »
Вот вывод в консоль, и кстати я только что заметил что верхняя строчка которую выводит консоль, говорит нам о том что сервер не может запрекешить модель триггера с типом multiple (такой тип в хамере можно создать) мб модельку ему прифигачить через SetModel()  ;D
Вот кстати один из созданых триггеров, как видно из параметров , он типо включен.
imgur.com/a/a2iys
userdata не посмотреть, ты прав.
Попробуй такую штуку для проверки нахождения триггера
Код
for _,thing in pairs( Entities:FindAllInSphere(unit:GetAbsOrigin(), 10 ) )  do
        if thing then
print(thing)
print(thing:GetName())
end
    end

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #6 : 28-02-2017, 10:21:16 »
Я не знаю, как у BMD реализован DebugPrint(), может там и есть то, что я тебе посоветую попробовать дальше, но попробуй глянуть так:

Код
for k,v in pairs(userdata) do
    print(k,v)
end

я пробовал это уже, в userdata нельзя заглянуть. даже когда я пишу вот так:
Код
for h,j in pairs(trigger.__self) do
    print(h,j)
  end
Консоль мне говорит что значение в pairs должно быть таблицей, а я ему даю userdata. Из чего можно сделать вывод что это не таблица.
Код
[   Developer            ]: ...me\dota_addons\game_custom\scripts\vscripts\hero_ability.lua:50: bad argument #1 to 'pairs' (table expected, got userdata)
[   Developer            ]: stack traceback:
[   Developer            ]: [C]: in function 'pairs'
[   Developer            ]: ...me\dota_addons\game_custom\scripts\vscripts\hero_ability.lua:50: in function <...me\dota_addons\wog_rpg\scripts\vscripts\hero_ability.lua:1>
[ W VScript              ]: Script Runtime Error: ...me\dota_addons\game_custom\scripts\vscripts\hero_ability.lua:50: bad argument #1 to 'pairs' (table expected, got userdata)
[ W VScript              ]: stack traceback:
[ W VScript              ]: [C]: in function 'pairs'
[ W VScript              ]: ...me\dota_addons\game_custom\scripts\vscripts\hero_ability.lua:50: in function <...me\dota_addons\wog_rpg\scripts\vscripts\hero_ability.lua:1>
« Последнее редактирование: 28-02-2017, 10:27:02 от RecoveryIt »

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #7 : 28-02-2017, 10:23:53 »
userdata не посмотреть, ты прав.
Попробуй такую штуку для проверки нахождения триггера
Код
for _,thing in pairs( Entities:FindAllInSphere(unit:GetAbsOrigin(), 10 ) )  do
        if thing then
print(thing)
print(thing:GetName())
end
    end

Зачем мне его искать если я вижу его в игре? Посмотри скрин выше. Он создается и даже пишит что включен, но как прикрутить срабатывание я не понимаю. Поэтому и спрашиваю тут.

Оффлайн Илья

  • Супермодератор
  • 2075
  • Мощь: 19
Re: Триггеры средствами lua.
« Ответ #8 : 28-02-2017, 10:27:27 »
Поверь, сделай проверку, как тебе предложил Cry. Может самой сущности нет, а какая-то оболочка присутствует (может это не триггер, а что-то другое).

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #9 : 28-02-2017, 10:33:19 »
Поверь, сделай проверку, как тебе предложил Cry. Может самой сущности нет, а какая-то оболочка присутствует (может это не триггер, а что-то другое).
Хотя я уверен что он создается сделал проверку для вас:

код:
Код
local trigger = CreateTriggerRadiusApproximate(caster:GetAbsOrigin(), 300.0)
  for _,thing in pairs( Entities:FindAllInSphere(caster:GetAbsOrigin(), 10 ) )  do
        if thing then
          print(thing)
          print(thing:GetName())
        end
    end

Вывод:
Код
[ W Entity System        ]: Attempting to precache model for entity 464 [trigger_multiple] at 63.61 569.31 128.00, but model name is NULL
[   VScript              ]: table: 0x033c8ec8
[   VScript              ]:
[   VScript              ]: table: 0x033c9018
[   VScript              ]:
[   VScript              ]: table: 0x033c9040
[   VScript              ]:
[   VScript              ]: table: 0x033b7c00
[   VScript              ]: npc_dota_hero_axe

первый из них мой созданный триггер, проверил.
« Последнее редактирование: 28-02-2017, 10:38:58 от RecoveryIt »

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #10 : 28-02-2017, 10:42:04 »
К слову, в CBaseEntity есть функция
Код
Trigger	void Trigger()	Fires off this entity's OnTrigger responses

что она делает, проверить не удалось, извращался как мог, но скорей всего в ней кроеется вся суть.
Реагирует на некоторые функции из CBaseEntity такие как GetCenter() , GetHealth(), что еще раз подтверждает ее нахождение в игре.
« Последнее редактирование: 28-02-2017, 10:47:06 от RecoveryIt »

Оффлайн CryDeS

  • Друзья CG
  • 1211
  • Мощь: 12
Re: Триггеры средствами lua.
« Ответ #11 : 28-02-2017, 10:48:11 »
userdata не посмотреть, ты прав.
Попробуй такую штуку для проверки нахождения триггера
Я чутка идиот, не то посоветовал.
Код
for _,thing in pairs( Entities:FindAllInSphere(unit:GetAbsOrigin(), 10 ) )  do
        if thing then
print(thing)
print(thing:GetClassname())
end
    end

Оффлайн RecoveryIt

  • 75
  • Мощь: 1
Re: Триггеры средствами lua.
« Ответ #12 : 28-02-2017, 10:49:31 »
Я чутка идиот, не то посоветовал.
Код
for _,thing in pairs( Entities:FindAllInSphere(unit:GetAbsOrigin(), 10 ) )  do
        if thing then
print(thing)
print(thing:GetClassname())
end
    end

Код
[   VScript              ]: trigger_multiple
[   VScript              ]: dota_item_wearable
[   VScript              ]: dota_item_wearable
[   VScript              ]: npc_dota_hero_axe
[   VScript              ]: __self: userdata: 0x03328d00

Оффлайн CryDeS

  • Друзья CG
  • 1211
  • Мощь: 12
Re: Триггеры средствами lua.
« Ответ #13 : 28-02-2017, 10:51:03 »
Код
[   VScript              ]: trigger_multiple
[   VScript              ]: dota_item_wearable
[   VScript              ]: dota_item_wearable
[   VScript              ]: npc_dota_hero_axe
[   VScript              ]: __self: userdata: 0x03328d00
Задача решена, не?
Код
local trigger = (тут создаешь триггер)
local unit = (тут получаешь своего юнита как нибудь)

for _,thing in pairs( Entities:FindAllInSphere(unit:GetAbsOrigin(), 10 ) )  do
        if thing and trigger == thing then
print("TOUCH")
end
    end

UPD:
Что можно сделать гораздо удобнее так:
Код
function CBaseTrigger:IsTouching(hUnit)
for _,thing in pairs( Entities:FindAllInSphere(hUnit:GetAbsOrigin(), 10 ) )  do
        if thing and self == thing then
return true
end
end
return false
end
« Последнее редактирование: 28-02-2017, 10:58:50 от CryDeS »

Оффлайн CryDeS

  • Друзья CG
  • 1211
  • Мощь: 12
Re: Триггеры средствами lua.
« Ответ #14 : 28-02-2017, 10:53:42 »
Либо, можно вручную высчитать столкновение через координаты, благо CBaseTrigger наследуется от CBaseEntity, и имеет GetAbsOrigin и GetBoundingMaxs/GetBoundingMins.