Можно ли удалить предметы определенного типа, в указанной области. К примеру мне надо удалить руны с определенной зоны, можно это устроить?

Raised, а зачем ты сначала добавляешь в массив с помощью EnumItemsInRect, а потом идёшь по нему циклом?
library RegionRemoveItemType

    globals
        private integer CurrentType
    endglobals

    function RemoveItemOfType takes nothing returns nothing
        if GetItemTypeId(GetFilterItem()) == CurrentType then
            call RemoveItem(GetFilterItem())
        endif
    endfunction


    function RemoveItemOfTypeInRect takes rect r, integer iT returns nothing
        set CurrentType = iT
        call EnumItemsInRect(r, function RemoveItemOfType, null) // да, в filter можно передавать функции, которые ничего не возвращают.
    endfunction
    
endlibrary

Да и вариант 8gabriel8 нормальный, как раз для человека, который не разбирается в Jass.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
перемещать
при создание идёт выделение памяти а при перемещение лишь изменение полей объекта
но всё зависит от интервала и количества предметов
ибо уже при 400 предметах бывают лаги
ответ
Frozen_Cat, тут 2 варианта:
  • нужна система отлова и дифференциации урона. Это в случае если сайленс должны при применении исключительно дамажащих спеллов.
  • нужна система детекта текущей цели юнита. В случае, когда сайленс должен получать любой юнит, применивший любое заклинание против героя.
ответ
Custom, Никак, HeroAbilityList низя править во время игры, делайте несколько героев с разными наборами скиллов на изучение, а потом морфите.
Как правильно морфить можно найти инфу тут.
Перед морфом желательно убирать все предметы из инвентаря.
ответ
Код выше имеет вероятность вызвать фатал (от драколича инфа, что из-за чтения памяти по несуществующему адресу, я пока отталкиваюсь от того, что из-за несуществующей точки мб втч).
Уже был промежуточный вариант номер 2, он фатал вызвал сразу после сборки линзы, что подтверждает отчасти моё мнение...
Сейчас тестирую этот. По крайней мере линза с ним собралась уже без фатала.
Новый тест код линзы (ща главное, чтобы работал)
ЭФИРНАЯ ЛИНЗА
function AetherLens_Actions takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
local unit u5 = GetTriggerUnit()
local unit u6 = GetSpellTargetUnit()
local integer a = GetUnitAbility(u5,GetSpellAbilityId())
local location p = GetUnitLoc(u5)
local location p2
local integer i = 0
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА
if (u6 != null) then
set p2 = GetUnitLoc(u6)
else
if GetSpellTargetLoc() != null then
set p2 = GetSpellTargetLoc()
endif
endif
if p2 != null then
if ( UnitHasItemOfTypeBJ(GetTriggerUnit(), 'I01O') == true ) then
if DistanceBetweenPoints(p,p2) > 200 then
call SetUnitState(u5, UNIT_STATE_MANA, GetUnitState(u5, UNIT_STATE_MANA) + DistanceBetweenPoints(p,p2) * 0.04)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",u5,"chest"))
if GetAbilityDataHeroRng(a, i) > 200 and GetAbilityDataHeroRng(a, i) < 1000 and (GetAbilityCD(GetSpellAbilityId(), GetUnitAbilityLevelSwapped(GetSpellAbilityId(), GetTriggerUnit())) >= 1) then
set i = GetAbilityMaxLevel(GetSpellAbilityId()) + 1
loop
exitwhen i < 1
set i = i-1
call SetAbilityDataHeroRng(a,i,GetAbilityDataHeroRng(a, i) + 50)
endloop
endif
endif
endif
call RemoveLocation (p2)
endif
ЭФФЕКТЫ, ОБСЧЕТ И ДОБАВКА РЕНДЖА - ЗАКРЫТО.
call RemoveLocation (p)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: u5, u6, p, p2
set u5 = null
set u6 = null
set p = null
set p2 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
===========================================================================
function InitTrig_AetherLens takes nothing returns nothing
local trigger AetherLens = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( AetherLens, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( AetherLens, function AetherLens_Actions )
set AetherLens = null
endfunction
ЭФИРНАЯ ЛИНЗА - ЗАКРЫТО.
Если что: в первичном коде не было вообще предусмотрено, что точки p2 может не существовать и что в таком случае делать.
ответ
nvc123, если честно мне его действия очень напоминают хитрое попрошайничество. Да и на сайте тем по типу - "Как посчитать количество предметов в области" уже штук 3-4 было. Да и я бы ему рекомендовал провернуть такой трюк сначала с одним предметом а потом понять принцип и склепать по аналогии еще сколько нужно раз. И не проще ли сделать 1 круг для все этих 10 предметов и рядом круг для жертвы?

21
native EnumItemsInRect
native GetItemType / GetItemTypeId
17
Raised:
native EnumItemsInRect
native GetItemType / GetItemTypeId
Куда и как вписать зону и тип предмета?
21
Тебе подойдет пример на Jass? Я в графических триггерах не разбираюсь.
17
Raised:
Тебе подойдет пример на Jass? Я в графических триггерах не разбираюсь.
В Jass я не разбираюсь, смогу только скопировать, желательно выделить то, что придется изменить и объяснить как именно это сделать.
18
Извини за грубость, но прежде чем задать этот вопрос ты сам попробовал полистать GUI меню со всякими функциями или почитать это?
17
UrsaBoss:
Извини за грубость, но прежде чем задать этот вопрос ты сам попробовал полистать GUI меню со всякими функциями или почитать это?
Через триггеры можно выбрать конкретный предмет у героя и удалить его, но массово в какой-то зоне, тем более конкретный , я такого не нашел.
26
Absolute, поддерживаю UrsaBoss, вроде бы ты за серьёзную вещь взялся, но вопросы такие, что просто подумать, порыться в редакторе или вбить вопрос в поисковик. Сюда обращаются, когда уже все эти варианты испробованы.

Вот скрин из карты, где делал перемещение предметов из изолированной локации вслед за героем. Чтобы отсеять лишь нужные предметы, ставь действие If/Then/Else.
Загруженные файлы
17
8gabriel8:
Absolute, поддерживаю UrsaBoss, вроде бы ты за серьёзную вещь взялся, но вопросы такие, что просто подумать, порыться в редакторе или вбить вопрос в поисковик. Сюда обращаются, когда уже все эти варианты испробованы.

Вот скрин из карты, где делал перемещение предметов из изолированной локации вслед за героем. Чтобы отсеять лишь нужные предметы, ставь действие If/Then/Else.
Но я не смогу сделать этого с предметом определенного типа, удалятся все предметы?
21
Предметы могут быть следующих типов:

ITEM_TYPE_ANY
ITEM_TYPE_ARTIFACT
ITEM_TYPE_CAMPAIGN
ITEM_TYPE_CHARGED
ITEM_TYPE_MISCELLANEOUS
ITEM_TYPE_PERMANENT
ITEM_TYPE_POWERUP
ITEM_TYPE_PURCHASABLE
ITEM_TYPE_TOME
ITEM_TYPE_UNKNOWN

При конвертации регионов в рект, к названию региона добавляется префикс gg_rct_Название_Региона (пустые места между словами заменяются "_" (нижним подчеркиванием)).

Избегай кириллических символов в названиях регионов. Потому что они конвертируются в это. Как именно - думай сам, если оно вообще тебе нужно.
То что тебе нужно делается с помощью следующей команды/функции:
    call rRemoveItemType(название твоего региона,тип предмета из списка выше)
Пример: prntscr.com/kc5cot
Алсо стоит сказать что технически регион - это группа ректов.
code
library RegionRemoveItemType

    globals
        private item array ITEMS
        private integer i = 0
    endglobals


    function rRemoveItemTypeAction takes nothing returns nothing
        set ITEMS[i] = GetEnumItem()
        set i = i+1
    endfunction


    function rRemoveItemType takes rect r, itemtype iT returns nothing
        call EnumItemsInRect(r,null,function rRemoveItemTypeAction)
        
        loop
            if GetItemType(ITEMS[i]) == iT then
                call RemoveItem(ITEMS[i])
                set ITEMS[i] = null
            else
                set ITEMS[i] = null
            endif
        exitwhen i == 0
            set i = i-1
        endloop
    endfunction
    
endlibrary
26
Ну вот опять
Но я не смогу сделать этого с предметом определенного типа, удалятся все предметы?
Чтобы отсеять лишь нужные предметы, ставь действие If/Then/Else.
Загруженные файлы
21
Absolute, и да, что ты подразумеваешь под типом предметов? itemtype или itemtypeid (равкод)?
17
Raised:
Absolute, и да, что ты подразумеваешь под типом предметов? itemtype или itemtypeid (равкод)?
Конкретный предмет, например -руна исцеления- , удалить тип предметов -руна исцеления- значит удалить все руны исцеления с выбранной зоны
8gabriel8:
Ну вот опять
Но я не смогу сделать этого с предметом определенного типа, удалятся все предметы?
Чтобы отсеять лишь нужные предметы, ставь действие If/Then/Else.
Не могу разобраться, у меня руссификатор стоит, но как бы я не вертел функцию с предметом, там никак не выходило выбрать конкретный тип предметов, если они не у героя
21
Понял. Тогда тебе нужно это:
 call rRemoveItemType(название твоего региона,равкод предмета)
code
library RegionRemoveItemType

    globals
        private item array ITEMS
        private integer i = 0
    endglobals


    function rRemoveItemTypeAction takes nothing returns nothing
        set ITEMS[i] = GetEnumItem()
        set i = i+1
    endfunction


    function rRemoveItemType takes rect r, integer iT returns nothing
        call EnumItemsInRect(r,null,function rRemoveItemTypeAction)
        
        loop
            if GetItemTypeId(ITEMS[i]) == iT then
                call RemoveItem(ITEMS[i])
                set ITEMS[i] = null
            else
                set ITEMS[i] = null
            endif
        exitwhen i == 0
            set i = i-1
        endloop
    endfunction
    
endlibrary

В топку руссификатор.
28
Raised, а зачем ты сначала добавляешь в массив с помощью EnumItemsInRect, а потом идёшь по нему циклом?
library RegionRemoveItemType

    globals
        private integer CurrentType
    endglobals

    function RemoveItemOfType takes nothing returns nothing
        if GetItemTypeId(GetFilterItem()) == CurrentType then
            call RemoveItem(GetFilterItem())
        endif
    endfunction


    function RemoveItemOfTypeInRect takes rect r, integer iT returns nothing
        set CurrentType = iT
        call EnumItemsInRect(r, function RemoveItemOfType, null) // да, в filter можно передавать функции, которые ничего не возвращают.
    endfunction
    
endlibrary

Да и вариант 8gabriel8 нормальный, как раз для человека, который не разбирается в Jass.
Принятый ответ
21
PT153, теперь я сам бы хотел знать. Думаю - потому что забыл как enum работает.
26
Absolute:
Не могу разобраться, у меня руссификатор стоит
Тогда понятно почему такие вопросы, в русификаторе перевод не несёт должного понимания сути. Вот карта с примером триггера xgm.guru/files/100/211841/comments/390977/1.w3x, чтобы посмотрел с русификатором.
Загруженные файлы
17
8gabriel8:
Absolute:
Не могу разобраться, у меня руссификатор стоит
Тогда понятно почему такие вопросы, в русификаторе перевод не несёт должного понимания сути. Вот карта с примером триггера xgm.guru/files/100/211841/comments/390977/1.w3x, чтобы посмотрел с русификатором.
Так куда понятнее.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.