2 Вопроса по предметам

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#1
И так первый вопрос как ограничить возможность поднятия определенного предмета для одной команды. Пробовал через фильтр приказов но как то не вышло(
И второй вопрос, как удалить дропнутый предмет с карты, не из игры, а просто с карты, так что бы его можно было потом еще раз создать.
Надеюсь вы поможете мне)
 
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#2

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#3
Да я фигню написал какую то xD

function GameMode:FilterExecuteOrder(filterTable)

local units_table = filterTable["units"]
local ability = filterTable["entindex_ability"]
local order = filterTable["order_type"]
local TargetIndex = filterTable["entindex_target"]

for key, hero in pairs(units_table) do
local HHeroIndex = EntIndexToHScript(hero)

if order == 14 and hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS then
local HTargetIndex = EntIndexToHScript(TargetIndex)
local HTargetName = HTargetIndex:GetName() --Я ПРОСТО ХЗ КАК ПОЛУЧИТЬ ИМЯ ПРЕДМЕТА НУ ТО ЕСТЬ ЦЕЛИ, КАК ПОНИМАЮ ЭТО РАБОТАЕТ ТОЛЬКО С ЮНИТАМИ ИЛИ С ГЕРОЯМИ ХЗ

if HTargetName == itemBomb:GetName() then
return false
else
return true
end
end
end
return true
end


Насчет удаление предмета, он вроде как удаляется и при попытке его поднять он исчезает, но сама моделька предмета остается на карте, пока не попробуешь его поднять( Возможно я просто не до конца понимаю как именно это юзать?
 

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#5
Ты применяешь и к дропу и к предмету?
Вот щас не понял, я применяю его только к не знаю как это называется в общем вот ты поймешь.

itemBomb = CreateItem( "item_bomb_c", nil, nil )
CreateItemOnPositionSync(killedUnit:GetOrigin(), itemBomb)

и удаляю после
UTIL_Remove( itemBomb )
 
Реклама:
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#6
Код:
itemBomb = CreateItem( "item_bomb_c", nil, nil )
drop = CreateItemOnPositionSync(killedUnit:GetOrigin(), itemBomb)
UTIL_Remove( itemBomb )
UTIL_Remove( drop )
P.S: Пиши код в блок кода (на панели редактирования Вставить>Код)
 

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#7
Код:
itemBomb = CreateItem( "item_bomb_c", nil, nil )
drop = CreateItemOnPositionSync(killedUnit:GetOrigin(), itemBomb)
UTIL_Remove( itemBomb )
UTIL_Remove( drop )
P.S: Пиши код в блок кода (на панели редактирования Вставить>Код)
Что должно быть на месте drop? PS я дописал просто UTIL_Remove( drop ) и все так же как и было до этого. И не знаешь по поводу фильтра на подъем предмета?
 
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#8
Посмотри внимательно код, что я скинул. Он отличается от твоего не только строчкой 'UTIL_Remove( drop )'
Касательно фильтра - отправь, как ты его устанавливаешь.
 

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#9
Посмотри внимательно код, что я скинул. Он отличается от твоего не только строчкой 'UTIL_Remove( drop )'
Касательно фильтра - отправь, как ты его устанавливаешь.
В общем попробовал по твоему гайду, но я явно сделал что то не так:(

Код:
_G.GameMode = class({})
_G.Filter = class({})

-- Create the game mode when we activate
function Activate()
    GameRules.GameMode = GameMode()
    GameRules.GameMode:InitGameMode()
end

function GameMode:InitGameMode()
    GameRules:GetGameModeEntity():SetExecuteOrderFilter( Dynamic_Wrap( Filter, "OrderFilter" ), self )
end

function Filter:OrderFilter( kv )
    local hero = PlayerResource:GetSelectedHeroEntity(kv.issuer_player_id_const)
    print("OrderFilter")
    
    if hero and hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS then
    local TargetIndex = kv.entindex_target
    local HTargetIndex = EntIndexToHScript(TargetIndex)
    local HTargetName = HTargetIndex:GetName()
    
        if HTargetName == itemBomb:GetName() then
                print("DOTA_TEAM_GOODGUYS")
                return false
        end
    else
    return true
    end
end
 
Реклама:

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#11
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#12
Перенеси print("OrderFilter") после строк
Код:
if HTargetName == itemBomb:GetName() then
    print("DOTA_TEAM_GOODGUYS")
    return false
end
И проверь, будет ли срабатывать принт
 

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#13
Срабатывает и спамиться, но в
Перенеси print("OrderFilter") после строк
Код:
if HTargetName == itemBomb:GetName() then
    print("DOTA_TEAM_GOODGUYS")
    return false
end
И проверь, будет ли срабатывать принт
В общем переписал немного скрипт
Код:
function Filter:OrderFilter( kv )
    print("OrderFilter")
    local hero = PlayerResource:GetSelectedHeroEntity(kv.issuer_player_id_const)
    local TargetIndex = kv.entindex_target
    local HTargetIndex = EntIndexToHScript(TargetIndex)
    local HTargetName = HTargetIndex:GetName()
    
    if itemBomb and hero and hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS and HTargetName == itemBomb:GetName() then
        print("return false")
        return false
    else
    print("return true")
    return true
    end
    
end
По итогу когда делаю любое действие:
OrderFilter
return true

Когда пытаюсь поднять предмет:
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: attempt to index local 'HTargetIndex' (a nil value)
stack traceback:
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: in function <..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:75>
Script Runtime Error: ..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: attempt to index local 'HTargetIndex' (a nil value)
stack traceback:
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: in function <..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:75>
 
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#14
Видимо для подъема предмета не предусматривается entindex_target

Сделай вот такой принт, это выведет все поля таблицы, которая передается в фильтр, и посмотри, по каким из них можно определить подбираемый предмет:
Код:
for k, v in pairs(kv) do print(k,v) end
 
14 Авг 2017
407
19
18
17
Проект
Battle Heroes Arena
Реакции
25 0 0
#15
Да я фигню написал какую то xD

function GameMode:FilterExecuteOrder(filterTable)

local units_table = filterTable["units"]
local ability = filterTable["entindex_ability"]
local order = filterTable["order_type"]
local TargetIndex = filterTable["entindex_target"]

for key, hero in pairs(units_table) do
local HHeroIndex = EntIndexToHScript(hero)

if order == 14 and hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS then
local HTargetIndex = EntIndexToHScript(TargetIndex)
local HTargetName = HTargetIndex:GetName() --Я ПРОСТО ХЗ КАК ПОЛУЧИТЬ ИМЯ ПРЕДМЕТА НУ ТО ЕСТЬ ЦЕЛИ, КАК ПОНИМАЮ ЭТО РАБОТАЕТ ТОЛЬКО С ЮНИТАМИ ИЛИ С ГЕРОЯМИ ХЗ

if HTargetName == itemBomb:GetName() then
return false
else
return true
end
end
end
return true
end


Насчет удаление предмета, он вроде как удаляется и при попытке его поднять он исчезает, но сама моделька предмета остается на карте, пока не попробуешь его поднять( Возможно я просто не до конца понимаю как именно это юзать?
Ордер фильтр выглядит ужасно и не правильно, не используй константные выражения ордер типов, всегда они могут поменяться в значениях, но врятле в названиях переменных.
Насчёт запрета: Берешь имя айтема, (GetAbilityName()) не уверен, но это врятле сработает, так как фильтр происходит перед поднятие и код не видит айтем у героя.
 
Реклама:

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#16
Видимо для подъема предмета не предусматривается entindex_target

Сделай вот такой принт, это выведет все поля таблицы, которая передается в фильтр, и посмотри, по каким из них можно определить подбираемый предмет:
Код:
for k, v in pairs(kv) do print(k,v) end
Когда подбираю предмет, да уж что то тут все печально(
Код:
entindex_ability    0
sequence_number_const    9
queue    0
units    table: 0x0017c308
entindex_target    175
position_z    0
position_x    0
order_type    14
position_y    0
issuer_player_id_const    0


OrderFilter
return true
Придумал вариант, но какой то костыльный и не самый хороший, если есть лучше можете отписать)
Lua:
function Filter:OrderFilter( kv )
    local hero = PlayerResource:GetSelectedHeroEntity(kv.issuer_player_id_const)

    if hero and hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS then
        BlockBomb( kv )
        return true
      
    else
    return true
    end

end

function BlockBomb( kv )
local hero = PlayerResource:GetSelectedHeroEntity(kv.issuer_player_id_const)

Timers:CreateTimer({
    endTime = 0.1,
    callback = function()

  
  if hero:HasInventory() then
    for itemSlot = 0, 5, 1 do
      local Item = hero:GetItemInSlot( itemSlot )
        if Item ~= nil and Item:GetName() == "item_bomb_c" then
          --local pos = Vector( kv.position_x, kv.position_y, kv.position_z )
      
          itemBomb = CreateItem("item_bomb_c", nil, nil)
          drop = CreateItemOnPositionSync(hero:GetOrigin(), itemBomb)
          hero:RemoveItem(Item)
        end
    end

    else
  end


    end
  })

end
 
Последнее редактирование:
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#17
Лол, так у тебя же там есть entindex_target, и он даже не 0.
Что-то мне подсказывает, что эта ошибка у тебя происходила не когда ты пытался подобрать предмет.
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: attempt to index local 'HTargetIndex' (a nil value)
stack traceback:
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: in function <..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:75>
Script Runtime Error: ..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: attempt to index local 'HTargetIndex' (a nil value)
stack traceback:
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:80: in function <..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:75>
Верни к прошлой версии, только вставь в начало фильтрации проверку
Код:
if kv.order_type == DOTA_UNIT_ORDER_PICKUP_ITEM then
А еще покажи, где ты инициализируешь переменную itemBomb
Вообще я не понимаю, зачем она тебе нужна, если ты можешь сделать проверку по имени, как ты это делаешь в последнем отправленном тобой коде
 

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#18
А еще покажи, где ты инициализируешь переменную itemBomb
Создается предмет на карте, тогда и создается эта переменная

Лол, так у тебя же там есть entindex_target, и он даже не 0.
Что-то мне подсказывает, что эта ошибка у тебя происходила не когда ты пытался подобрать предмет.
Ошибка высвечивается когда герой поднимает предмет. Но вот странность в общем и так выкладываем предмет отходим от него, чистим лог, далее нажимаем на предмет герой его берет и ошибок нет.
Код:
OrderFilter
entindex_ability    0
sequence_number_const    208
queue    0
units    table: 0x001c56b0
entindex_target    974
position_z    0
position_x    0
order_type    14
position_y    0
issuer_player_id_const    0
return true
OrderFilter
entindex_ability    0
sequence_number_const    209
queue    0
units    table: 0x001bb8c8
entindex_target    974
position_z    0
position_x    0
order_type    14
position_y    0
issuer_player_id_const    0
return true
[BAREBONES] OnItemPurchased
{
   itemname                            = "item_bomb_c" (string)
   PlayerID                            = 1 (number)
   splitscreenplayer                   = -1 (number)
   ItemEntityIndex                     = 804 (number)
   HeroEntityIndex                     = 885 (number)
}
А теперь выкладываем предмет около игрока не отходя от него чистим лог и берем и вот она ошибка.
Код:
OrderFilter
entindex_ability    0
sequence_number_const    238
queue    0
units    table: 0x001bc598
entindex_target    970
position_z    0
position_x    0
order_type    14
position_y    0
issuer_player_id_const    0
return true
[BAREBONES] OnItemPurchased
{
   itemname                            = "item_bomb_c" (string)
   PlayerID                            = 1 (number)
   splitscreenplayer                   = -1 (number)
   ItemEntityIndex                     = 919 (number)
   HeroEntityIndex                     = 885 (number)
}
OrderFilter
entindex_ability    0
sequence_number_const    239
queue    0
units    table: 0x00214e40
entindex_target    970
position_z    0
position_x    0
order_type    14
position_y    0
issuer_player_id_const    0
..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:124: attempt to index local 'HTargetIndex' (a nil value)
stack traceback:
    ..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:124: in function <..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:115>
Script Runtime Error: ..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:124: attempt to index local 'HTargetIndex' (a nil value)
stack traceback:
    ..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:124: in function <..._addons\dota_strike\scripts\vscripts\addon_game_mode.lua:115>
Это немного странно а вот код
Код:
function GameMode:OrderFilter( kv )
    print("OrderFilter")
    for k, v in pairs(kv) do print(k,v) end
    
    if kv.order_type == DOTA_UNIT_ORDER_PICKUP_ITEM then
    
    local hero = PlayerResource:GetSelectedHeroEntity(kv.issuer_player_id_const)
    local TargetIndex = kv.entindex_target
    local HTargetIndex = EntIndexToHScript(TargetIndex)
    local HTargetName = HTargetIndex:GetName()
    
    if itemBomb and hero and hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS and HTargetName == itemBomb:GetName() then
        print("return false")
        return false
    else
    print("return true")
    return true
    end
    
    else
    print("return true NOT PICKUP")
    return true
    end
    
end
 
20 Дек 2016
489
61
28
10
Проект
DI:LS
Реакции
77 0 0
#19
Я понял источник твоей проблемы. Видимо у тебя стоит автоповтор пкм, либо ты просто слишком часто нажимаешь, но суть в том, что пока итем лежит на земле ты успеваешь кликнуть по нему 2+ раза. Но так как он подбирается при первом, в последующих фильтрациях его уже на земле как бы нет, потому и HTargetIndex nil. Можешь даже, если интересно, отойти и через шифт предмет прокликать много раз. Короче тупо проверку надо сделать if HTargetIndex then
A для дропа, чтобы получить имя предмета, используй drop:GetContainedItem():GetName()
 
Последнее редактирование:

Findes

Пользователь
6 Ноя 2018
20
0
1
18
Проект
Dota Strike
Реакции
0 0 0
#20
Я понял источник твоей проблемы. Видимо у тебя стоит автоповтор пкм, либо ты просто слишком часто нажимаешь, но суть в том, что пока итем лежит на земле ты успеваешь кликнуть по нему 2+ раза. Но так как он подбирается при первом, в последующих фильтрациях его уже на земле как бы нет, потому и HTargetIndex nil. Можешь даже, если интересно, отойти и через шифт предмет прокликать много раз. Короче тупо проверку надо сделать if HTargetIndex then
A для дропа, чтобы получить имя предмета, используй drop:GetContainedItem():GetName()
В общем то все пофиксил единственное что вместо
Код:
drop:GetContainedItem():GetName()
работает
Код:
drop:GetName()
 
Реклама:
Реклама: